方格填数
如下的10个格子
±-±-±-+
| | | |
±-±-±-±-+
| | | | |
±-±-±-±-+
| | | |
±-±-±-+
(如果显示有问题,也可以参看【图1.jpg】)
填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)
一共有多少种可能的填数方案?
请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。
用了最简单的暴力法:
下面是代码,有部分注释,很容易看懂
答案:1580
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
bool isTrue(int m,int n,int arr[3][4]){
for(int i=m-1;i<=m+1;i++){//以arr[m][n]数字为中心,循环遍历它周围的8个数字和它是否相邻
for(int j=n-1;j<=n+1;j++){
//排除不在方格位置的数字和本身
if(i>=0&&i<=2&&j>=0&&j<=3&&(!(i==0&&j==0))&&(!(i==2&&j==3))&&(!(i==m&&j==n))){
if(abs(arr[i][j]-arr[m][n])<=1){
return false;
}
}
}
}
return true;
}
bool fun(int *a){
int arr[3][4];
int k=0;
for(int i=0;i<3;i++){//第一个for循环 将一维数组中的10个数字放入9个方格中,除去(0,0)和(2,3)这两个位置
for(int j=0;j<4;j++){
if(!((i==0&&j==0)||(i==2&&j==3))){
arr[i][j]=a[k++];
}
}
}
for(int i=0;i<3;i++){//第二个for循环 从第一个数字开始判断每个数字放的位置是否符合条件
for(int j=0;j<4;j++){
if((!(i==0&&j==0))&&(!(i==2&&j==3))){
if(!(isTrue(i,j,arr))){
return false;
}
}
}
}
return true;
}
int main(){
int a[10]={0,1,2,3,4,5,6,7,8,9};
int k=0;
do{
if(fun(a)){
k++;
}
}while(next_permutation(a,a+10));//对一维数组中0~9这十个数字进行全排列,判断是否符合条件
cout<<k<<endl;
return 0;
}