深度优先搜索:方格填数_ios

// Author:PanDaoxi
#include <iostream>
#include <cmath>
using namespace std;
int flag[3][4];
int mpt[3][4];
bool visit[10];
int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
int ans=0;
bool Solve(){
	for(int i=0;i<3;i++){
		for(int j=0;j<4;j++){
			if(flag[i][j]==0) continue;
			for(int k=0;k<8;k++){
				int x,y;
				x=i+dir[k][0];
				y=j+dir[k][1];
				if(x<0||x>=3||y<0||y>=4||flag[x][y]==0) continue;
				if(abs(mpt[x][y]-mpt[i][j])==1) return false; 
			}
		}
	}
	return true;
}
void dfs(int x,int y){
	if(x==2&&y==3){
		if(Solve()) ans++;
		return;
	}
	for(int i=0;i<10;i++){
		if(!visit[i]){
			visit[i]=true;
			mpt[x][y]=i;
			if(y+1<4) dfs(x,y+1);
			else dfs(x+1,0);
			visit[i]=false;
		}
	}
}
int main(){
	for(int i=0;i<3;i++){
		for(int j=0;j<4;j++){
			flag[i][j]=1;
		}
	}
	flag[0][0]=0;
	flag[2][3]=0;
	dfs(0,1);
	cout<<ans;
}