嗯,第一次做时想了好久,后来找答案,发现正方形不能旋转。嗯,看错了。
#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);
}}