问题描述
如下的10个格子
如下的10个格子
+--+--+--+
| | | |
+--+--+--+--+
| | | | |
+--+--+--+--+
| | | |
+--+--+--+
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请输出表示方案数目的整数。
注意:你输出的应该是一个整数,不要输出任何多余的内容或说明性文字。
输入
没有输入。
输出
输出一个整数,即可能的填数方案数。
题目限制
1s, 1024KiB for each test case.
提示
用printf或和cout输出答案。
思路:
1.生成数字0~9的全排列
2.在每一次新生成的全排列检查题目要求中的相邻
3.我们在方格中可以把数组a依次填入其中,数组序号从0~9
4.上下相邻:a[i] / a[i+4] (i:0~5)
5.左右相邻:a[i] / a[i+1] (i:0~8,一定要注意这里i!=2,6,就是在这里我没注意)
6.左边顶相邻:a[i] / a[i+3] (i:0~6,i!=3)
7.右边顶相邻:a[i] / a[i+5] (i:0~4,i!=2)
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <string.h>
using namespace std;
int sx_check(int *a)
{
for(int i=0;i<=5;i++)
{
if(abs(a[i]-a[i+4])==1)
return 0;
}
return 1;
}
int zy_check(int *a)
{
for(int i=0;i<=8;i++)
{
if(i==2||i==6)
continue;
if(abs(a[i]-a[i+1])==1)
return 0;
}
return 1;
}
int zd_check(int *a)
{
for(int i=0;i<=6;i++)
{
if(i==3)
continue;
if(abs(a[i]-a[i+3])==1)
return 0;
}
return 1;
}
int yd_check(int *a)
{
for(int i=0;i<=4;i++)
{
if(i==2)
continue;
if(abs(a[i]-a[i+5])==1)
return 0;
}
return 1;
}
int main()
{
int x=10,ans=0;
int a[]= {0,1,2,3,4,5,6,7,8,9};
do
{
int f1,f2,f3,f4;
//上下检查有无相邻
f1=sx_check(a);
//左右检查有无相邻
f2=zy_check(a);
//左边的顶角检查有无相邻
f3=zd_check(a);
//右边的顶角检查有无相邻
f4=yd_check(a);
if(f1&&f2&&f3&&f4)
ans++;
}
while(next_permutation(a,a+x));
printf("%d\n",ans);
return 0;
}