方格填数——全排列

题目如下:

 1 //2018.2.5
 2 //方格填数
 3 #include<iostream>
#include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 const int INF = 10000000; 8 int a[]={0,1,2,3,4,5,6,7,8,9}; 9 int map[3][4]; 10 int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{1,1},{1,-1},{-1,1}};//八个方位 11 int cnt=0; 12 13 void input(){ 14 memset(map,0,sizeof(map)); 15 map[0][0]=map[2][3]=INF; 16 for(int j=1;j<4;j++){ 17 map[0][j]=a[j-1]; 18 } 19 for(int j=0;j<4;j++){ 20 map[1][j]=a[j+3]; 21 } 22 for(int j=0;j<3;j++){ 23 map[2][j]=a[j+7]; 24 } 25 } 26 27 bool judge(int r,int c){ //判断是否在框内 28 if((r==0&&c==0)||(r==2&&c==3)||r<0||r>=3||c<0||c>=4){ 29 return false; 30 } 31 return true; 32 } 33 34 bool check(){ //判断是否相邻 35 for(int i=0;i<3;i++){ 36 for(int j=0;j<4;j++){ 37 int ni=i,nj=j; 38 for(int k=0;k<8;k++){ 39 ni+=dir[k][0]; 40 nj+=dir[k][1]; 41 if(judge(i,j)&&judge(ni,nj)){ 42 if((abs(map[i][j]-map[ni][nj])==1)){ 43 return false; 44 } 45 } 46 } 47 } 48 } 49 return true; 50 } 51 52 void solve(){ 53 do{ 54 input(); 55 if(check()){ 56 cnt++; 57 } 58 }while(next_permutation(a,a+10)); //全排列 59 cout<<cnt<<endl; 60 } 61 62 int main(){ 63 solve(); 64 return 0; 65 }

使用全排列,将不同组合的数字,分别放到10个格子中,然后对10个格子枚举,判断每个格子的周围是否有与之连续的数字,判断完10个格子都没有相邻数字重复的,则说明方案数++。

posted @ 2018-02-05 21:43  最咸的鱼  阅读(395)  评论(0编辑  收藏  举报