求解填数字游戏问题(DFS回溯)

【问题描述】
在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;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40163242/article/details/88123153