【问题描述】
在3*3方阵中填入1到10内某9个整数,每方格填一个,使所有相邻两个方格两个整数之和为质数,输出满足要求的情况总数
【思路】
构建一个二维数组,常规回溯搜法来搜就可以了,值得注意的就是,对角相邻不符合本题中相邻的定义!这种题很有蓝桥杯的填空题风格
代码:
#include<iostream>
using namespace std;
int maze[4][4]; //小方阵
int ans = 0;
int tag[11];
bool IsPrime(int x) //判断素数最简单的算法
{
for(int i = 2;i * i <= x;i++)
{
if(x % i == 0)
return false;
}
return true;
}
bool panduan(int x, int y, int t)
{
if(tag[t] == 1)
return false;
if(x - 1 >= 1)
{
if(!IsPrime(maze[x - 1][y] + t))
return false;
}
if(y - 1 >= 1)
{
if(!IsPrime(maze[x][y - 1] + t))
return false;
}
return true;
}
void dfs(int x, int y)
{
if(x == 4) //说明已经来到边界
{
ans++;
/*
cout << "********" << endl;
可以输出查看结果
for(int i = 1;i <= 3;i++)
{
for(int j = 1;j <= 3;j++)
{
cout << maze[i][j] << " ";
}
cout << endl;
}
*/
return ;
}
for(int i = 1;i <= 10;i++)
{
if(panduan(x, y, i))
{
tag[i] = 1;
maze[x][y] = i;
if(y != 3)
dfs(x, y + 1);
else
dfs(x + 1, 1);
maze[x][y] = 0;
tag[i] = 0;
}
}
}
int main()
{
dfs(1, 1);
cout << ans << endl;
return 0;
}
运行结果: