方格填数

探讨了一种解决方格填数问题的算法,通过深度优先搜索(DFS)策略,确保连续数字不相邻,实现0~9数字在10个格子中的有效填充,详细解析了实现过程及代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方格填数
如图,如下的10个格子,填入0~9的数字。要求:连续的两个数字不能相邻。 
(左右、上下、对角都算相邻)一共有多少种可能的填数方案? 
请填写表示方案数目的整数。

解题思路:

从左到右,从上到下依次填写数字

对于红色方格来说,只有绿色方格是已经填好数字了,因此,要在红色方格中填写正确的数字,只要满足两个条件即可。

1.所要填写的数字是否已经被其他格子占用;

2.与绿色格子中的数字之差是否为1;

源码附上:

#include <bits/stdc++.h>
using namespace std;
int A[3][4];
int nums[10];
int dir[4][2]={-1,-1,-1,0,-1,1,0,-1};
int cou=0;

int check(int x,int y,int k)
{
	for(int i=0;i<4;i++)
	{
		int xx=x+dir[i][0];
		int yy=y+dir[i][1];
		if(xx<0||xx>2||yy<0||yy>3)
			continue;
		if(abs(A[xx][yy]-k)==1)
			return false;
	}
	return true;
}

void dfs(int x,int y)
{
	if(x==2&&y==3)
	{
		cou++;
		return;
	}
	if(y>3)
	{
		y=0;
		x=x+1;
	}
	for(int i=0;i<=9;i++)
	{
		if(nums[i]==0&&check(x,y,i))
		{
			nums[i]=1;
			A[x][y]=i;
			dfs(x,y+1);
			nums[i]=0;
			A[x][y]=-10;
		}
	}
}

int main()
{
	memset(A,-10,sizeof(A));
	dfs(0,1);//从0,1出发 
	cout<<cou<<endl;
	return 0;
}

做dfs的惯性思维:总是向它的左上右下移动,其实并不然,要合理正确灵活的应用,根据实际需求出发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值