PDA

View Full Version : Nhờ mọi người



siro391992
09-02-2008, 21:53
Moi người coi hộ em bài này
Xét một ô đất hcn m*n .Mỗi ô đất có thể có hoặc chưa có ngôi nhà nào.Người ta mô tả
miếng này băng bảng hcn mỗi ô chứa môt số là tổng số nhà xây xung quanh nó (các ô có chung đỉnh hoặc cạnh ).Hãy nêu rõ bản đồ về tình trạng các ngôi nhà ỏ khu đó.
input
1 1 1 2 0 1 0 0
1 3 3 3 1 1 0 0
0 2 1 3 2 2 2 1
0 3 3 5 2 2 3 1
1 4 4 5 4 3 3 3
0 4 5 6 5 3 3 1
1 4 5 7 5 3 3 2
0 2 3 5 4 4 1 1
output
0 1 1 0 1 0 0 0
0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 1 1 0 1
0 0 1 1 0 0 1 0
1 0 1 1 0 0 0 1
0 0 1 1 1 1 0 0
0 0 1 1 1 0 1 0

Nhờ mọi người xem hộ

phuninh
10-02-2008, 18:10
Mình chưa hiểu yêu cầu của bài lắm Vì Input như thế mà Ouput lại không thấy logic cho lắm.

m2mpro
10-02-2008, 19:48
Xin lỗi nhưng hoàn toàn không hiểu gì cả. :D :D
Input như thế nào mà cần xuất ra Output ra sao .

siro391992
10-02-2008, 20:49
Xin lỗi nhưng hoàn toàn không hiểu gì cả. :D :D
Input như thế nào mà cần xuất ra Output ra sao .
Xin lỗi
Nhưng đúng rồi đó

m2mpro
10-02-2008, 20:51
Có nghĩa là bạn cũng hổng biết đề muốn nói gì chứ gì. :D :D

siro391992
10-02-2008, 20:56
Có nghĩa là bạn cũng hổng biết đề muốn nói gì chứ gì. :D :D

code nè
const fi='khoiphuc.inp';
fo='khoiphuc.out';
var f:text;
m,n:longint;
a,x:array[-1..105,-1..105]of integer;
ok,doi:boolean;
procedure doc;
var i,j,tg:integer;
begin
assign(f,fi);
reset(f);
readln(f,m,n);
doi:=false;
if m<=n then
for i:=1 to m do
begin
for j:=1 to n do read(f,a[i,j]);
readln(f);
end
else begin
for i:=1 to m do
begin
for j:=1 to n do read(f,a[j,m+1-i]);
readln(f);
end;
doi:=true;
tg:=m;
m:=n;
n:=tg;
end;
close(f);
end;
procedure inkq;
var i,j:integer;
begin
assign(f,fo);rewrite(f);
if ok=true then begin
writeln(f,'YES');
if doi=false then
for i:=1 to m do
begin
for j:=1 to n do
write(f,x[i,j],#32);
writeln(f);
end
else
for i:=n downto 1 do
begin
for j:=1 to m do write(f,x[j,i],#32);
writeln(f);
end;
end
else writeln(f,'NO');
close(f);
end;
function thoaman(k:integer):boolean;
var i,u,v:integer;
begin
thoaman:=false;ok:=false;
if (k=n+1) and(x[1,k]<>0)then exit;
if (k=m+1) and(x[k,1]<>0)then exit;
for i:=2 to k do
begin
u:=i;v:=k-1;
while (u<=k)and(v>=2) do
begin
x[u,v]:=a[u-1,v-1]-(x[u,v-1]+x[u,v-2]+x[u-1,v-2]
+x[u-2,v-2]+x[u-2,v-1]+x[u-2,v]
+x[u-1,v]);
if (u<=m) and((x[u,v]<0)or(x[u,v]>1))then exit;
if (v=n+1)and(x[u,v]<>0)then exit;
if (u=m+1)and(x[u,v]<>0)then exit;
inc(u);dec(v);
end;
end;
thoaman:=true;ok:=true;
end;
procedure try(k:integer);
var i,j:integer;
begin
if k>n+1 then
begin
inkq;
halt;
end;
for i:=0 to 1 do
for j:=0 to 1 do
begin
x[1,k]:=i;
x[k,1]:=j;
if thoaman(k)then
begin try(k+1);
if ok then exit;
end;
end;
end;
procedure tinh;
var i:integer;
begin
for i:=0 to 1 do
begin
x[1,1]:=i;
try(2);
end;
end;
procedure kt;
var i,j:integer;
begin
for i:=1 to m do
begin
x[i,-1]:=0;
x[i,0]:=0;
end;
for j:=1 to n do
begin
x[-1,j]:=0;
x[0,j]:=0;
end;
end;
BEGIN
DOC;
KT;
TINH;
INKQ;
END.
(0 chi chua có ngôi nhà xây dựng
1 chỉ đã có ngôi nhà xây dựng
ở test in put mỗi ô chỉ số nhà xây xung quanh)

mr_invincible
10-02-2008, 21:56
Không hiểu bạn hỏi mọi người xem hộ là thế nào nhỉ? Hỏi xong lại viết code ra?
:dontgetit :dontgetit

phuclun
10-02-2008, 22:30
đề bài này cũng dễ hiểu mà,giống như trò Minesweeper trong máy tính đó

tranvanho
11-02-2008, 09:35
ui trời
mình ổng hiểu đề rùi mình ổng làm
vui ghê

TIG_Messi
12-02-2008, 18:32
Đây là bài duyệt quay lui thôi :p
Dạng này quen rồi, đúng như phuclun nói đó :)

nncb2008
18-02-2008, 22:39
Mình đọc code của Siro391992 nhưng chẳng hiểu mấy. Bạn có thể mô tả lại cho mình hiểu thêm được không?