蓝桥杯 表格填数(DFS及next_permutation函数的使用)

如下的10个格子
在这里插入图片描述
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
答案:1580

解题思路:通过next_permutation函数暴力枚举

#include<cstdio> 
#include<math.h>
#include<algorithm>
using namespace std;
int main(void){
	int a[] = {0,1,2,3,4,5,6,7,8,9};
	int sum = 0;
	do
	{
		if(
		(abs(a[0]-a[1])!=1)&&(abs(a[0]-a[3])!=1)&&(abs(a[0]-a[4])!=1)&&(abs(a[0]-a[5])!=1)&&
		(abs(a[1]-a[2])!=1)&&(abs(a[1]-a[4])!=1)&&(abs(a[1]-a[5])!=1)&&(abs(a[1]-a[6])!=1)&&
		(abs(a[2]-a[5])!=1)&&(abs(a[2]-a[6])!=1)&&
		(abs(a[3]-a[4])!=1)&&(abs(a[3]-a[7])!=1)&&(abs(a[3]-a[8])!=1)&&
		(abs(a[4]-a[5])!=1)&&(abs(a[4]-a[7])!=1)&&(abs(a[4]-a[8])!=1)&&(abs(a[4]-a[9])!=1)&&
		(abs(a[5]-a[6])!=1)&&(abs(a[5]-a[8])!=1)&&(abs(a[5]-a[9])!=1)&&
		(abs(a[6]-a[9])!=1)&&
		(abs(a[7]-a[8])!=1)&&
		(abs(a[8]-a[9])!=1)
		)
		sum++;
	}while(next_permutation(a,a+10));
	printf("%d",sum);
}

解题思路:通过DFS,把方格补充为5*6的方格初值置为0,然后将2-11填入方格中,因为是从上到下,从左到右填入表格中所以每个方格只需要与左边以及上面三个方格中的数进行判断。

#include<cstdio>
#include<math.h>
int a[4][5]  = {0};
int Y[4] = {-1,-1,0,1}; 
int X[4] = {0,-1,-1,-1};
int hashtable[10] = {0};
int num[10] = {2,3,4,5,6,7,8,9,10,11};
int sum = 0;
bool check(int i,int j)
{
	for(int k = 0;k < 4;k++){
		if(abs(a[i][j] - a[i + X[k]][j + Y[k]]) == 1)
			return false;
	}
	return true;
}
void dfs(int i,int j)
{
	if(i == 3&&j == 4)
	{
		sum++;
		return;
	}
	for(int m = 0;m < 10;m++)
	{
		if(hashtable[m]==0)
		{
			a[i][j] = num[m];
			if(check(i,j))
			{
				hashtable[m] = 1;
				if(j == 4)
					dfs(i+1,1);
				else
					dfs(i,j+1);	
				hashtable[m] = 0;  //结束之后将占有的数返还 
				a[i][j] = 0;	
			}
		}
	}
}
int main(void)
{
	dfs(1,2);
	printf("%d",sum);
	return 0;
}
发布了24 篇原创文章 · 获赞 1 · 访问量 496

猜你喜欢

转载自blog.csdn.net/lovingcgq/article/details/104482261