蓝桥杯2016年C++ B组 6_方格填数


方格填数

如下的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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值