蓝桥杯:方格填数

谁说胖子不能爱 提交于 2020-03-17 07:33:55

如下的10个格子

在这里插入图片描述
填入0~9的数字。

要求:连续的两个数字不能相邻。

(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。

注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

#include<iostream>
#include<cmath>

using namespace std;

int a[10], ans = 0;

/*暴力检查*/
bool check()
{
	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)
		return false;
	return true;
}

void solve(int k)
{
	int  t, i;
	if (k == 10)
	{
		bool b = check();
		if (b)
		{
			ans++;
		}
		return;
	}
	/*相当于生成全排列*/
	else if (k < 10) 
	{
		for (i = k; i < 10; ++i)
		{
			/*尝试交换a[i]和a[k]的数值*/
			t = a[i];
			a[i] = a[k];
			a[k] = t;

			solve(k + 1);

			/*回溯*/
			t = a[i];
			a[i] = a[k];
			a[k] = t;
		}
	}
}
int main()
{
	int i;
	for (i = 0; i <= 9; ++i)
	{
		a[i] = i;
	}
	solve(0);
	cout << ans << endl;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!