方格填数
如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
#include <iostream>
using namespace std;
int count;
int next[4][2]={{0,-1},{-1,-1},{-1,0},{-1,1}};
int a[3][4];
int flag[10];
bool check(int x,int y,int n){ //传入当前位置的当前数字
for(int i=0;i<=3;i++){
int tx,ty;
//计算下一个点的坐标
tx = x + next[i][0];
ty = y + next[i][1];
//计算该点是否超出边界
if(tx<=2&&tx>=0&&ty<=3&&ty>=0){
if(a[tx][ty]==n-1||a[tx][ty]==n+1)
return false;
}
}
return true;
}
void dfs(int row,int line){
if(row==2&&line==3){
count++;
return;
}
if ( line >= 4) {
dfs(row + 1, 0);
}
else {
for (int i = 0; i <= 9; i++) {
//这个数i没用过,并且没有越出格子
if (flag[i]==0 && check(row, line, i)) {
flag[i] = 1;
a[row][line] = i;
dfs(row, line + 1);
a[row][line] = -2;
flag[i] = 0;
}
}
}
}
int main(){
/*
*/
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 3; j++) {
a[i][j] = -2;
}
}
// memset(flag, 0, sizeof(flag));
count = 0;
dfs(0, 1); //(0,0)为缺口,所以从(0,1)开始
cout << count << endl; //1580
return 0;
}