Problem 1116 : Jigsaw Puzzles for Computers

問題概要

以下のようなコンピュータ用のジグソーパズルがある。
各ピースは正方形で、それぞれの辺にはアルファベット1文字が書かれている。
接する辺のアルファベットの大文字小文字が異なり、同じ文字であるようなピースが隣接できる。


ピースは9つあり、これを3x3の正方形に上の条件を満たして並べる場合の数を求めよ。

解法

深さ優先探索により解を全部列挙する。

ソースコード

int dy[]={-1,0,1,0},dx[]={0,1,0,-1};
int ans,sp[3][3];
char pc[9][5];
bool use[9];

void rec(int c)
{
	if(c==9)
	{
		ans++; return;
	}
	rep(i,9)if(!use[i])
	{
		sp[c/3][c%3]=i; use[i]=1;
		rep(rt,4)
		{
			rep(d,4)
			{
				int y=c/3+dy[d],x=c%3+dx[d];
				if(y<0||x<0||y>=3||x>=3||sp[y][x]<0)continue;
				char c1=pc[i][d],c2=pc[sp[y][x]][d^2];
				if(abs(c1-c2)!=abs('A'-'a'))goto FAIL;
			}
			rec(c+1);
			FAIL:
			rotate(pc[i],pc[i]+1,pc[i]+4);
		}
		sp[c/3][c%3]=-1; use[i]=0;
	}
}

int sol()
{
	rep(i,9)use[i]=0,sp[i/3][i%3]=-1; ans=0;
	rec(0);
	return ans;
}

int main()
{
	int n; scanf("%d",&n);
	rep(i,n)
	{
		rep(j,9)scanf("%s",pc[j]);
		printf("%d\n",sol());
	}
	return 0;
}