PDA

View Full Version : Bài khó: Đường đi của robot



Bùi Xuân Hải
12-10-2010, 18:05
Đường đi của robot
Cho một bàng vuông (n n) ô (2<=n<=100) các ô ghi các số là 0 hoặc 1. Tìm đường đi của robot, từ góc trái trên xuống góc phải dưới theo nguyên tắc được dịch chuyển sang phải và xuống dưới sao cho các số trên đường đi tạo thành một số nhị phân có giá trị lớn nhất.
Dữ liệu vào: ghi trong tệp tin văn bản Robot.inp gồm
- Dòng đầu tiên ghi giá trị
- N dòng tiếp theo, trên mỗi dòng ghi n số 0 hoặc 1 các số này cách nhau ít nhất 1 khoảng trống.
Dữ liệu ra: Ghi vào tập tin văn bản robot.out gồm một số duy nhất là giá trị thập phân của số nhị phân được tạo thành ở trên.
Ví dụ
Robot.inp
5
1 0 1 1 0
0 0 1 0 1
0 0 1 0 1
1 0 0 1 1
1 1 0 1 0
robot.out
374

do.phuan
18-03-2011, 10:40
Theo mình thì bài này giải bằng quy hoạch động
Mình code bài này bằng pascal bạn tham khảo thử nhé
CONST fi='ROBOT.INP';
fo='ROBOT.OUT';
TYPE mang=ARRAY[0..100,0..100] OF STRING;
VAR n:BYTE;
f:TEXT;
a:mang;
PROCEDURE xuly(VAR a:mang);
VAR i,j,t:BYTE;
ch:CHAR;
BEGIN
FOR i:=1 TO n DO
BEGIN
a[1,i]:=#32;
a[i,1]:=#32;
END;
FOR i:=1 TO n DO
FOR j:=1 TO n DO
BEGIN
read(f,t);
ch:=chr(ord('0')+t);
IF a[i-1,j]>a[i,j-1] THEN a[i,j]:=a[i-1,j]+ch
ELSE a[i,j]:=a[i,j-1]+ch;
END;
END;

FUNCTION luythua(x,y:BYTE):INTEGER;
VAR i:BYTE; temp:INTEGER;
BEGIN
temp:=1;
IF y=0 THEN
luythua:=1
ELSE IF y=1 THEN
luythua:=x
ELSE
BEGIN
FOR i:=1 TO y DO
temp:=temp*x;
luythua:=temp;
END;
END;

FUNCTION he10(s:STRING):LONGINT;
VAR t,i,j:BYTE; temp:LONGINT;
BEGIN
t:=length(s); temp:=0;
FOR i:=1 TO length(s) DO
BEGIN
t:=t-1;
val(s[i],j);
temp:=temp+j*luythua(2,t);
END;
he10:=temp;
END;

PROCEDURE docfile;
BEGIN
assign(f,fi);
reset(f);
readln(f,n);
xuly(a);
close(f);
END;

PROCEDURE ghifile; VAR i:BYTE;
BEGIN
assign(f,fo);
rewrite(f); writeln(f,a[n,n]);
write(f,he10(a[n,n]));
close(f);
END;
BEGIN
docfile;
ghifile;
END.