sairate c9f8710d03 sairate<sairate@sina.cn>
Signed-off-by: sairate <sairate@sina.cn>
2025-07-12 16:05:52 +08:00

325 lines
7.6 KiB
ObjectPascal

unit undertpu;
interface
procedure start;
procedure move(ch:char);
function look(ch:char):char;
procedure finish(x,y:integer);
implementation
uses dos;
const
serdarWALL='W';
serdarOPEN='O';
serdarMARK='c';
OUR_FILE_SIZE =6;
start_not_called = 1;
move_to_wall = 2;
file_size_wrong = 3;
wrong_argument = 4;
a_lot_start = 5;
a_lot_looks = 7;
var
serdarn,serdarm :integer;
serdartahta:array [0..99,0..99] of char;
serdarch :char;
serdarx,serdary,serdarmin :integer;
basx,basy :integer;
serdarcompetition :boolean;
serdar_num_looks :word;
serdarstart :boolean;
ffblk:SearchRec;
our_file:string[10];
eval_inp_dosyasi :string[10];
inp_dosyasi :string[11];
pla_dosyasi :string[10];
xy_dosyasi :string[7];
puan_dosyasi :string[9];
result_dosyasi:string[11];
ten,zero:byte;
procedure serdar_error(x:integer);forward;
function serdarust(x:integer):integer;
begin serdarust:=(((x)+serdarn-1) mod serdarn);end;
function serdarsol(x:integer):integer;
begin serdarsol:=(((x)+serdarm-1) mod serdarm);end;
function serdaralt(x:integer):integer;
begin serdaralt:=(((x)+1) mod serdarn);end;
function serdarsag(x:integer):integer;
begin serdarsag:=(((x)+1) mod serdarm);end;
procedure solve_names;
var
i:integer;
begin
for i:=1 to Length(inp_dosyasi) do
inp_dosyasi[i]:=chr(ord(inp_dosyasi[i])+40);
for i:=1 to Length(eval_inp_dosyasi) do
eval_inp_dosyasi[i]:=chr(ord(eval_inp_dosyasi[i])+40);
for i:=1 to Length(pla_dosyasi) do
pla_dosyasi[i]:=chr(ord(pla_dosyasi[i])+40);
for i:=1 to Length(xy_dosyasi) do
xy_dosyasi[i]:=chr(ord(xy_dosyasi[i])+40);
for i:=1 to Length(our_file) do
our_file[i]:=chr(ord(our_file[i])+40);
for i:=1 to Length(puan_dosyasi) do
puan_dosyasi[i]:=chr(ord(puan_dosyasi[i])+40);
for i:=1 to Length(result_dosyasi) do
result_dosyasi[i]:=chr(ord(result_dosyasi[i])+40);
end;
procedure start;
var
i,j:integer;
f:TEXT;
begin
if (serdarstart) then serdar_error(a_lot_start);
solve_names;
findfirst(our_file,AnyFile,ffblk);
if(doserror<>0) then
serdarcompetition:=true
else
begin
if(ffblk.size = OUR_FILE_SIZE) then
serdarcompetition:=False
else
begin
serdarstart:=true;
serdar_error(file_size_wrong);
end;
end;
if(serdarcompetition) then assign(f,inp_dosyasi) else assign(f,eval_inp_dosyasi);
reset(f);
read(f,serdarm,serdarn);
for i:=0 to serdarn-1 do
begin
for j:=0 to serdarm-1 do
read(f,serdartahta[i,j]);
readln(f);
end;
read(f,serdarch);
close(f);
if(serdarcompetition) then
begin
assign(f,pla_dosyasi);
reset(f);
read(f,serdarx,serdary);
close(f);
end
else
begin
assign(f,xy_dosyasi);
reset(f);
read(f,serdarx,serdarmin,serdary);
close(f);
end;
basx:=serdarx;
basy:=serdary;
serdary:=basx-1;
serdarx:=serdarn-basy;
serdarstart:=true;
end;
procedure serdar_error(x:integer);
var
f:TEXT;
begin
if(not serdarstart) then solve_names;
if(serdarcompetition) then
begin
assign(f,result_dosyasi);
rewrite(f);
write(f,'Error');
close(f);
end
else begin
assign(f,puan_dosyasi);
rewrite(f);
write(f,x,' ',zero);
close(f);
end;
halt;
end;
procedure move(ch:char);
begin
if(not serdarstart)then serdar_error(start_not_called);
case ch of
'S':serdarx:=serdaralt(serdarx);
'N':serdarx:=serdarust(serdarx);
'E':serdary:=serdarsag(serdary);
'W':serdary:=serdarsol(serdary);
else serdar_error(wrong_argument);
end;
if(serdartahta[serdarx,serdary]<>serdarOPEN)then serdar_error(move_to_wall);
end;
function look(ch:char):char;
begin
if(not serdarstart)then serdar_error(start_not_called);
if (serdar_num_looks>20000) then serdar_error(a_lot_looks);
inc(serdar_num_looks);
case ch of
'S':if(serdartahta[serdaralt(serdarx),serdary]=serdarOPEN)
then look:=serdarOPEN else look:=serdarWALL;
'N':if(serdartahta[serdarust(serdarx),serdary]=serdarOPEN)
then look:=serdarOPEN else look:=serdarWALL;
'E':if(serdartahta[serdarx,serdarsag(serdary)]=serdarOPEN)
then look:=serdarOPEN else look:=serdarWALL;
'W':if(serdartahta[serdarx,serdarsol(serdary)]=serdarOPEN)
then look:=serdarOPEN else look:=serdarWALL;
else serdar_error(wrong_argument);
end;
end;
procedure finish(x,y:integer);
var
f:TEXT;
puan:integer;
begin
if(not serdarstart)then serdar_error(start_not_called);
if (serdarcompetition) then assign(f,result_dosyasi) else assign(f,puan_dosyasi);
rewrite(f);
if(serdarcompetition) then
begin
writeln(f,x,' ',y);
write(f,'You used look ',serdar_num_looks,' times');
end
else if(x=basx) and (y=basy) then
begin
if (serdar_num_looks <= serdarmin) then puan:=ten
else if (serdar_num_looks >= serdarmin+serdarmin) then puan:=zero
else puan:= trunc ( ( 10.0 * ( 2.0 * serdarmin - serdar_num_looks ) ) / serdarmin + 0.5);
write(f,zero,' ',puan);
end
else
begin
write(f,ten,' ',zero);
end;
close(f);
halt;
end;
begin
serdar_num_looks:=0;
serdarstart:=false;
ten:=10;
zero:=0;
eval_inp_dosyasi[0]:=chr(9);
eval_inp_dosyasi[1]:=chr(65);
eval_inp_dosyasi[2]:=chr(70);
eval_inp_dosyasi[3]:=chr(72);
eval_inp_dosyasi[4]:=chr(77);
eval_inp_dosyasi[5]:=chr(76);
eval_inp_dosyasi[6]:=chr(6);
eval_inp_dosyasi[7]:=chr(76);
eval_inp_dosyasi[8]:=chr(80);
eval_inp_dosyasi[9]:=chr(76);
eval_inp_dosyasi[10]:=chr(0);
inp_dosyasi[0]:=chr(9);
inp_dosyasi[1]:=chr(77);
inp_dosyasi[2]:=chr(70);
inp_dosyasi[3]:=chr(60);
inp_dosyasi[4]:=chr(61);
inp_dosyasi[5]:=chr(74);
inp_dosyasi[6]:=chr(6);
inp_dosyasi[7]:=chr(65);
inp_dosyasi[8]:=chr(70);
inp_dosyasi[9]:=chr(72);
inp_dosyasi[10]:=chr(0);
pla_dosyasi[0]:=chr(9);
pla_dosyasi[1]:=chr(72);
pla_dosyasi[2]:=chr(68);
pla_dosyasi[3]:=chr(57);
pla_dosyasi[4]:=chr(59);
pla_dosyasi[5]:=chr(61);
pla_dosyasi[6]:=chr(6) ;
pla_dosyasi[7]:=chr(76);
pla_dosyasi[8]:=chr(80);
pla_dosyasi[9]:=chr(76);
pla_dosyasi[10]:=chr(0) ;
xy_dosyasi[0]:=chr(6);
xy_dosyasi[1]:=chr(80);
xy_dosyasi[2]:=chr(81);
xy_dosyasi[3]:=chr(6) ;
xy_dosyasi[4]:=chr(63);
xy_dosyasi[5]:=chr(65);
xy_dosyasi[6]:=chr(74);
xy_dosyasi[7]:=chr(0) ;
puan_dosyasi[0]:=chr(8);
puan_dosyasi[1]:=chr(72);
puan_dosyasi[2]:=chr(77);
puan_dosyasi[3]:=chr(57);
puan_dosyasi[4]:=chr(70);
puan_dosyasi[5]:=chr(6) ;
puan_dosyasi[6]:=chr(59);
puan_dosyasi[7]:=chr(65);
puan_dosyasi[8]:=chr(67);
puan_dosyasi[9]:=chr(0) ;
result_dosyasi[0]:=chr(10);
result_dosyasi[1]:=chr(74);
result_dosyasi[2]:=chr(61);
result_dosyasi[3]:=chr(75);
result_dosyasi[4]:=chr(77);
result_dosyasi[5]:=chr(68);
result_dosyasi[6]:=chr(76);
result_dosyasi[7]:=chr(6);
result_dosyasi[8]:=chr(76);
result_dosyasi[9]:=chr(80);
result_dosyasi[10]:=chr(76);
result_dosyasi[11]:=chr(0);
our_file[0]:=chr(9);
our_file[1]:=chr(67);
our_file[2]:=chr(61);
our_file[3]:=chr(68);
our_file[4]:=chr(57);
our_file[5]:=chr(68);
our_file[6]:=chr(57);
our_file[7]:=chr(67);
our_file[8]:=chr(57);
our_file[9]:=chr(6) ;
our_file[10]:=chr(0) ;
end.