方格填数
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
做这题的时候踩了审题的坑
第一次是把“相邻”看成了相同”
之后又觉得填入的数字可以重复,得到了一个大的离谱的结果
最后看了答案才知道自己审题错了
(题目好像没有说数字不能重复啊)qwq
实现代码:
#include<iostream>
using namespace std;
int q[6][5];
bool used[10];
int cnt;
void dfs(int x,int y)
{
if (x == 4 && y == 3)
{
cnt++;
for (int i = 0; i <= 9; i++)
if (used[i] == true)
cout << i << ' ';
cout << endl;
for (int i = 0; i <= 3; i++)
{
for (int j = 0; j <= 4; j++)
printf("%3d", q[j][i]);
cout << endl;
}
cout << endl;
return;
}
/*摆数字*/
for (int i = 0; i <= 9; i++)
{
if (used[i] == true)
continue;
if (
abs(q[x - 1][y]-i )== 1
|| abs(q[x + 1][y] - i) == 1
|| abs(q[x][y - 1]-i) == 1
|| abs(q[x][y + 1]-i) == 1
|| abs(q[x - 1][y - 1] -i) == 1
|| abs(q[x + 1][y + 1]-i) == 1
|| abs(q[x + 1][y - 1] - i) == 1
|| abs(q[x - 1][y + 1] -i) == 1
)
continue;
q[x][y] = i;
used[i] = true;
if (x == 4 && y == 1)
dfs(4, 2);
else if (x == 1 && y == 2)
dfs(1, 3);
else if (y == 1)
dfs(x + 1, y);
else if (y == 2)
dfs(x - 1, y);
else if (y == 3)
dfs(x + 1, y);
used[i] = false;
}
//702107280
if (q[x][y] == -100)
return;
/*恢复现场*/
q[x][y] = -100;
}
int main()
{
for (int i = 0; i <= 4; i++)
for (int j = 0; j <= 5; j++)
q[j][i] = -100;
dfs(2,1);
cout << cnt;
}