题目: | 方块转换 | |
来源: | Usaco1.2.2 | |
题目大意: | 给定7种变换,求一个N*N的图形到目标图形所需的变换(仅一步切优先选择标号小的) | |
数据范围: | 1<=N<=10 | |
样例: |
3 @-@ --- @@- @-@ @-- --@ |
1 |
做题思路: | 神马是高科技,就是7个变换就写两个、其他的利用这两个就好 | |
知识点: | 矩阵旋转、翻转、枚举 |
{
ID:Dount Nameless
TASK:transform
LANG:PASCAL
}
var
a,b,c,t:array[0..11,0..11]of char;
i,j,k,n,f:longint;
procedure first;{<顺时针转90°>}
var
i,j:longint;
begin
fori:=1 to n do
forj:=1 to n do
b[i,j]:=a[n+1-j,i];
end;
procedure four;{<水平翻转>}
var
i,j:longint;
begin
fori:=1 to n do
forj:=1 to n do
b[i,n-j+1]:=a[i,j];
end;
function pd:boolean;{<判断>}
var
i,j:longint;
begin
fori:=1 to n do
forj:=1 to n do
ifc[i,j]<>b[i,j] then exit(false);
exit(true);
end;
procedure five(x:longint);
var
i:longint;
begin
t:=a;f:=0;
fori:=1 to 3 do
begin
a:=b;
first;
if(pd)then
begin
writeln(i);
f:=1;
exit;
end;
end;
a:=t;
end;
begin
assign(input,'transform.in');reset(input);
assign(output,'transform.out');rewrite(output);
readln(n);
fori:=1 to n do
begin
for j:=1 to n do
read(a[i,j]);
readln;
end;
fori:=1 to n do
begin
for j:=1 to n do
read(c[i,j]);
readln;
end;
fori:=1 to 7 do{<枚举7个变换、找到则输出>}
begin
case i of
1:begin
first;
if (pd)then
begin
writeln(i);
break;
end;
end;
2:begin
t:=a;
a:=b;
first;
if (pd)then
begin
writeln(i);
break;
end;
a:=t;
end;
3:begin
t:=a;
a:=b;
first;
if (pd)then
begin
writeln(i);
break;
end;
a:=t;
end;
4:begin
four;
if (pd)then
begin
writeln(i);
break;
end;
end;
5:begin
five(i);
if f=1 then break;
end;
6:begin
b:=a;
if (pd)then
begin
writeln(i);
break;
end;
end;
else writeln(i);
end;
end;
close(input);close(output);
end.
题目来源:
http://ace.delos.com/usacoprob2?a=RexmW8CclSt&S=transform