2016第七届蓝桥杯F方格填数 (全排列)

>>题目

如下的10个格子

填入0~9的数字。要求:连续的两个数字不能相邻。
(左右、上下、对角都算相邻)

一共有多少种可能的填数方案?

请填写表示方案数目的整数。
注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。

>>思路

将10个数填入方格中,明显的全排列问题,先生成全排列,再用check()检查这种排列是否符合连续的两个数字不能相邻的要求。(全排列部分的代码和TC相同)

>>代码(答案是1580)

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 
 4 int a[10]={0,1,2,3,4,5,6,7,8,9};
 5 int ans=0;
 6 
 7 bool check(){
 8     if(abs(a[1]-a[0])==1||//abs取绝对值少一半代码量 
 9         abs(a[2]-a[1])==1|| 
10         abs(a[3]-a[4])==1|| 
11         abs(a[4]-a[5])==1|| 
12         abs(a[5]-a[6])==1|| 
13         abs(a[7]-a[8])==1|| 
14         abs(a[8]-a[9])==1|| //左右不相邻 
15         
16         abs(a[3]-a[7])==1|| 
17         abs(a[0]-a[4])==1|| 
18         abs(a[4]-a[8])==1|| 
19         abs(a[1]-a[5])==1|| 
20         abs(a[5]-a[9])==1|| 
21         abs(a[2]-a[6])==1|| //上下不相邻 
22         
23         abs(a[3]-a[8])==1|| 
24         abs(a[9]-a[4])==1|| 
25         abs(a[0]-a[5])==1|| 
26         abs(a[1]-a[6])==1|| 
27         abs(a[0]-a[3])==1|| 
28         abs(a[6]-a[9])==1||  
29         abs(a[2]-a[5])==1|| 
30         abs(a[1]-a[4])==1|| 
31         abs(a[4]-a[7])==1|| 
32         abs(a[5]-a[8])==1 //对角不相邻 
33     ) return false;
34     return true; 
35 } 
36 
37 void f(int k){
38     if(k==10){
39         if(check()) ans++;
40     }
41     for(int i=k;i<10;i++){
42         {int t=a[i];a[i]=a[k];a[k]=t;}
43         f(k+1);
44         {int t=a[i];a[i]=a[k];a[k]=t;}
45     }
46 }
47 
48 
49 int main(){
50     f(0);
51     cout<<ans;
52 }

也可以用next_permutation啦

 1 #include<bits/stdc++.h> 
 2 using namespace std;
 3 
 4 int a[10]={0,1,2,3,4,5,6,7,8,9};
 5 int ans=0;
 6 
 7 bool check(){
 8     if(abs(a[1]-a[0])==1||//abs取绝对值少一半代码量 
 9         abs(a[2]-a[1])==1|| 
10         abs(a[3]-a[4])==1|| 
11         abs(a[4]-a[5])==1|| 
12         abs(a[5]-a[6])==1|| 
13         abs(a[7]-a[8])==1|| 
14         abs(a[8]-a[9])==1|| //左右不相邻 
15         
16         abs(a[3]-a[7])==1|| 
17         abs(a[0]-a[4])==1|| 
18         abs(a[4]-a[8])==1|| 
19         abs(a[1]-a[5])==1|| 
20         abs(a[5]-a[9])==1|| 
21         abs(a[2]-a[6])==1|| //上下不相邻 
22         
23         abs(a[3]-a[8])==1|| 
24         abs(a[9]-a[4])==1|| 
25         abs(a[0]-a[5])==1|| 
26         abs(a[1]-a[6])==1|| 
27         abs(a[0]-a[3])==1|| 
28         abs(a[6]-a[9])==1||  
29         abs(a[2]-a[5])==1|| 
30         abs(a[1]-a[4])==1|| 
31         abs(a[4]-a[7])==1|| 
32         abs(a[5]-a[8])==1 //对角不相邻 
33     ) return false;
34     return true; 
35 } 
36 
37 int main(){
38     do{
39         if(check()) ans++;
40     }while(next_permutation(a,a+10));
41     cout<<ans;
42 }

 

posted @ 2020-04-05 21:24  U40大贤者泰塔斯  阅读(215)  评论(0)    收藏  举报