方格填数
如下的10个格子
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
初看此题,很容易联想到非常经典的八皇后问题,因此解题思路大致确定为回溯算法。但作者今天准备介绍一种更加简单,理解更为容易的方法。首先将10个格子编号(如图所示),代表数组中的数a[0]~a[9]。
然后使用next_permutation();函数对0~9十个数字进行全排列,这样我们就列举出了十个数填入格子的所有可能情况。在所有情况中,再进行条件判断筛选出符合题目要求的结果。(虽然有些暴力,但作者自身觉得十分容易理解,且代码量短)
#include <iostream>
#include <algorithm>
using namespace std;
//返回1代表相邻,不符合条件
int Error(int m,int n)
{
if(m==n+1||m==n-1)
return 1;
return 0;
}
int main()
{
int a[10],i,count=0,flag=1;
for(i=0;i<10;i++)
a[i]=i;
while(next_permutation(a,a+10))
{
if(!(Error(a[0],a[1])||Error(a[1],a[2])||
Error(a[3],a[4])||Error(a[4],a[5])||Error(a[5],a[6])||
Error(a[7],a[8])||Error(a[8],a[9])||
//检查行
Error(a[3],a[7])||
Error(a[0],a[4])||Error(a[4],a[8])||
Error(a[1],a[5])||Error(a[5],a[9])||
Error(a[2],a[6])||
//检查列
Error(a[3],a[8])||Error(a[4],a[9])||Error(a[0],a[5])||Error(a[1],a[6])||
//检查左上至右下对角线
Error(a[0],a[3])||
Error(a[1],a[4])||Error(a[4],a[7])||
Error(a[2],a[5])||Error(a[5],a[8])||
Error(a[6],a[9])))
//检查右上至左下对角线
count++;
}
cout<<count<<endl;
return 0;
}