嗯,第一次做时想了好久,后来找答案,发现正方形不能旋转。嗯,看错了。
#include
<stdio.h>
#include
<memory.h>
int
array
[25][4];
int
use[25];
int
result[5][5];
bool
flag;
int
n;
bool
can(
int
x,
int
y,
int
i)
{
if
(x==0&&y==0)
return
true
;
else
if
(x==0&&y!=0)
{
if
(
array
[result[0][y-1]][1]!=
array
[i][3])
return
false
;
}
else
if
(y==0&&x!=0)
{
if
(
array
[result[x-1][0]][2]!=
array
[i][0])
return
false
;
}
else
{
if
(
array
[result[x-1][y]][2]!=
array
[i][0]||
array
[result[x][y-1]][1]!=
array
[i][3])
return
false
;
}
return
true
;
}
//**********************************************************
void
dfs(
int
k)
{
int
x,y,i;
x=k/n;
y=k%n;
if
(k==n*n)
{
flag=
true
;
return
;
}
for
(i=0;i<n*n;i++){
if
(use[i]!=0&&can(x,y,i)){
use[i]--;
result[x][y]=i;
dfs(k+1);
if
(flag)
return
;
use[i]++;
result[x][y]=-1;
}
}
}
//***********************************************************
int
main()
{
int
i,j;
int
a0,a1,a2,a3;
int
cases=0;
while
(scanf(
"%d"
,&n)&&n)
{
cases++;
flag=
false
;
memset(result,-1,
sizeof
(result));
memset(use,0,
sizeof
(use));
for
(i=0;i<n*n;i++)
{
scanf(
"%d%d%d%d"
,&a0,&a1,&a2,&a3);
use[i]=1;
array
[i][0]=a0;
array
[i][1]=a1;
array
[i][2]=a2;
array
[i][3]=a3;
}
dfs(0);
if
(cases>1)
printf(
"\n"
);
if
(flag)
printf(
"Game %d: Possible\n"
,cases);
else
printf(
"Game %d: Impossible\n"
,cases);
}}