01蓝桥杯第七届 方格填数(dfs)

 

方格填数

如下的10个格子 
+–+–+–+–+ 
| # | ? | ? | ? | 
+–+–+–+–+ 
| ? | ? | ? | ? | 
+–+–+–+–+ 
| ? | ? | ? | # | 
+–+–+–+–+

#:不能填数字;?:需要填写数字的空格 
填入0~9的数字。要求:连续的两个数字不能相邻。 
(左右、上下、对角都算相邻)

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

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

#include<iostream>
#include <algorithm>  
//#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10] = { 0,1,2,3,4,5,6,7,8,9 };
bool check()
{
	if (abs(a[0] - a[1]) == 1 || abs(a[1] - a[2]) == 1)return false;
	if (abs(a[3] - a[4]) == 1 || abs(a[4] - a[5]) == 1 || abs(a[5] - a[6]) == 1)return false;
	if (abs(a[7] - a[8]) == 1 || abs(a[8] - a[9]) == 1)return false;
	if (abs(a[3] - a[0]) == 1)return false;
	if (abs(a[1] - a[4]) == 1 || abs(a[4] - a[7]) == 1)return false;
	if (abs(a[2] - a[5]) == 1 || abs(a[5] - a[8]) == 1)return false;
	if (abs(a[6] - a[9]) == 1)return false;
	if (abs(a[3] - a[8]) == 1)return false;
	if (abs(a[4] - a[9]) == 1)return false;
	if (abs(a[0] - a[5]) == 1 || abs(a[1] - a[6]) == 1)return false;
	if (abs(a[3] - a[7]) == 1 || abs(a[0] - a[4]) == 1 || abs(a[4] - a[8]) == 1)return false;
	if (abs(a[1] - a[5]) == 1 || abs(a[9] - a[5]) == 1 || abs(a[2] - a[6]) == 1)return false;
	return true;
}
int main()
{
	
	int ans = 0;
	do {
		if (check())
			ans++;
	} //while (next_permutation(a, a + 10));
	while (next_permutation(a, a + 10));
	cout << ans;
}

  

原文地址:https://www.cnblogs.com/passion-sky/p/8516097.html