| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
ioi的题 就是恶心不会证明取值和这个哈希的正确性
就手工算了算8种变化的情况
program dsqwwe;
type
tt=array[0..100,0..100] of longint;
ttt=record
x,y:longint;
end;
var
map,map1,a:tt;
b:array[1..50] of tt;
v:array[0..100,0..100] of boolean;
n,m,i,j,ii,jj,st1,st2,ed1,ed2,t,sum,closed,open:longint;
s:string;
d:array[1..10000] of ttt;
function pd(a,b:tt):boolean;
var
i,j:longint;
begin
for i:=1 to n do
for j:=1 to m do
if a[i,j]<>b[i,j] then exit(false);
exit(true);
end;
procedure find(h,l:longint);
const
dx:array[1..8] of longint=(1,-1,0,0,1,1,-1,-1);
dy:array[1..8] of longint=(0,0,-1,1,1,-1,1,-1);
var
x,y,xx,yy,i:longint;
begin
fillchar(d,sizeof(d),0);
closed:=1;
open:=1;
d[1].x:=h; d[1].y:=l;
st1:=h; st2:=l; ed1:=h; ed2:=l;
v[h,l]:=true;
while closed<=open do
begin
x:=d[closed].x;
y:=d[closed].y;
for i:=1 to 8 do
begin
xx:=x+dx[i];
yy:=y+dy[i];
if (not v[xx,yy]) and (xx>0) and (xx<=n) and (yy>0) and (yy<=m) and (a[xx,yy]<>0) then
begin
inc(open);
d[open].x:=xx;
d[open].y:=yy;
v[xx,yy]:=true;
if xx<st1 then st1:=xx;
if xx>ed1 then ed1:=xx;
if yy<st2 then st2:=yy;
if yy>ed2 then ed2:=yy;
end;
end;
inc(closed);
end;
for i:=1 to open do
map[d[i].x-(st1-1),d[i].y-(st2-1)]:=1;
end;
function findd:longint;
var
nn,mm,i,j:longint;
begin
nn:=ed1-st1+1;
mm:=ed2-st2+1;
///1/////////
for i:=1 to sum do
if pd(map,b[i]) then exit(i);
///2////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[j,nn-i+1]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///3////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[nn-i+1,mm-j+1]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///4///////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[mm-j+1,i]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///5/////////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[nn-i+1,j]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///6//////////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[j,i]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///7///////////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[i,mm-j+1]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
///8///////////////////////
fillchar(map1,sizeof(map1),0);
for i:=1 to nn do
for j:=1 to mm do
map1[mm-j+1,nn-i+1]:=map[i,j];
for i:=1 to sum do
if pd(map1,b[i]) then exit(i);
////////
inc(sum);
b[sum]:=map;
exit(sum);
end;
begin
assign(input,'pku1175.in');
reset(input);
assign(output,'pku1175.out');
rewrite(output);
readln(m);
readln(n);
for i:=1 to n do
begin
readln(s);
for j:=1 to m do
a[i,j]:=ord(s[j])-ord('0');
end;
for i:=1 to n do
for j:=1 to m do
if (a[i,j]<>0) and (v[i,j]=false) then
begin
fillchar(map,sizeof(map),0);
find(i,j);
t:=findd;
for ii:=1 to open do
a[d[ii].x,d[ii].y]:=t;
end;
for i:=1 to n do
begin
for j:=1 to m do
if a[i,j]=0 then write(0)
else write(chr(a[i,j]+ord('a')-1));
writeln;
end;
close(input);
close(output);
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator