方格填数
如下的10个格子填入0~9的数字。 (如果显示有问题,也可以参看【图1.jpg】)
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
答案:1580
思路:看到0~9数字我就想到了全排列hhhhh虽然我知道这样判断条件会有毒了一点……
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
int main()
{
int num[10]={0,1,2,3,4,5,6,7,8,9};
int ans=0;
do
{
if(abs(num[0]-num[1])==1 || abs(num[0]-num[3])==1 || abs(num[0]-num[4])==1 || abs(num[0]-num[5])==1 || abs(num[1]-num[2])==1 || abs(num[1]-num[4])==1 || abs(num[1]-num[5])==1 || abs(num[1]-num[6])==1 || abs(num[2]-num[5])==1 || abs(num[2]-num[6])==1 || abs(num[3]-num[4])==1 || abs(num[3]-num[7])==1 || abs(num[3]-num[8])==1 || abs(num[4]-num[5])==1 || abs(num[4]-num[7])==1 || abs(num[4]-num[8])==1 || abs(num[4]-num[9])==1 || abs(num[5]-num[6])==1 || abs(num[5]-num[8])==1 || abs(num[5]-num[9])==1 || abs(num[6]-num[9])==1 || abs(num[7]-num[8])==1 || abs(num[8]-num[9])==1)
continue;
else
ans++;
}while(next_permutation(num,num+10));
cout<<ans<<endl;
return 0;
}
PS:也可以用dfs解决,传送地址:http://blog.youkuaiyun.com/y1196645376/article/details/50938608