求解一道银组USACO,希望提供思路,最好有程序(Pascal)!急!Problem 8: Jigsaw Puzzles 拼图谜题 [Rob Kolstad, 2008] 问题描述: 奶牛们在玩按字母表顺序排列的拼图谜题.每道谜题有R(1≤R≤10)列C(1≤C≤1

来源:学生作业帮助网 编辑:六六作业网 时间:2024/11/08 02:40:03
求解一道银组USACO,希望提供思路,最好有程序(Pascal)!急!Problem8:JigsawPuzzles拼图谜题[RobKolstad,2008]问题描述:奶牛们在玩按字母表顺序排列的拼图谜

求解一道银组USACO,希望提供思路,最好有程序(Pascal)!急!Problem 8: Jigsaw Puzzles 拼图谜题 [Rob Kolstad, 2008] 问题描述: 奶牛们在玩按字母表顺序排列的拼图谜题.每道谜题有R(1≤R≤10)列C(1≤C≤1
求解一道银组USACO,希望提供思路,最好有程序(Pascal)!急!
Problem 8: Jigsaw Puzzles 拼图谜题 [Rob Kolstad, 2008]

问题描述:
奶牛们在玩按字母表顺序排列的拼图谜题.每道谜题有R(1≤R≤10)列C(1≤C≤10)行的拼图块,它们边缘是由字母或封闭边界组成,完成后的整副拼图外围是边界线,中间的边界是字母.
每块拼图块都有一个序列号和4个字母或者数字表示边界线(顺序为上右下左),在输入中,数字充当边界线.
拼图可以换位和旋转,完成后的拼图在边缘的块上靠近外围的是边界线,拼图完成后,一块拼图若与另一块相邻,它们的边界字母必须相同,以下是一系列已经成功完成的拼图谜题共6块.
+---+ +---+ +---+
| 1 c c 3 d d 5 |
+-d-+ + a + +-e-+

+-d-+ +-a-+ +-e-+
| 2 b b 4 b b 6 |
+---+ +---+ +---+

程序文件名: jigsaw

输入格式:
第1行是两个整数R和C,用空格隔开,从第2行到第RxC+1行,每一行包含1个数字和4个代表边界的符号(可以是字母或数字0).

输入样例(jigsaw.in):
2 3
1 c d 0 0
2 0 d b 0
3 c 0 d a
4 b a b 0
5 d 0 0 e
6 0 0 b e

输入说明:
输入的数据描述的是问题描述中提供的样例.

输出格式:
轴出换位及旋转后的拼图共RxC行,每行第一个数字代表第几块拼图块,后面四个字符,按顺序代表4个边界字母(边界线仍用0表示).
答案可能有多组,输出一组即可.



输出样例(jigsaw.out):
1 0 c d 0
3 0 d a c
5 0 0 e d
2 d b 0 0
4 a b 0 b
6 e 0 0 b

输出说明:
如图所示的文本输出,可能还存在其他的正确的输出方案(如反射);评测系统将检查您的答案.

求解一道银组USACO,希望提供思路,最好有程序(Pascal)!急!Problem 8: Jigsaw Puzzles 拼图谜题 [Rob Kolstad, 2008] 问题描述: 奶牛们在玩按字母表顺序排列的拼图谜题.每道谜题有R(1≤R≤10)列C(1≤C≤1
爆搜就可以了
Var
n,r,c,i,j,temp,tot,x,y:longint;
flag:boolean;
a:array[1..100,1..4,1..4]of longint;
s:string;
sx:array[1..100]of longint;
ditu:array[0..11,0..11]of longint;
b:array[1..100,1..4]of longint;
stack:array[0..11,0..11,0..4]of longint;
Label 1;
Function ds(a:char):char;
begin
if ord(a)=96 then exit('0') else exit(a);
end;
Procedure print;
var i,j:longint;
begin
for i:=1 to r do
for j:=1 to c do
begin
write(stack[i,j,0],' ');
write(ds(chr(stack[i,j,1]+96)),' ');
write(ds(chr(stack[i,j,2]+96)),' ');
write(ds(chr(stack[i,j,3]+96)),' ');
writeln(ds(chr(stack[i,j,4]+96)),' ');
end;
end;
Procedure dfs(t:longint);
var i,j,k,x,y:longint;
begin
if t>r*c then begin print; {close(input); close(output); }halt; end;
x:=b[t,1]; y:=b[t,2];
for i:=1 to r*c do
if sx[i]=ditu[x,y] then
for j:=1 to 4 do
if (a[i,j,1]=stack[x-1,y,3])and(a[i,j,4]=stack[x,y-1,2]) then
begin
stack[x,y,0]:=i;
for k:=1 to 4 do stack[x,y,k]:=a[i,j,k];
dfs(t+1);
end;
end;
Function max(a,b:longint):longint;
begin
if a