题目
在2行5列的格子中填入1到10的数字。
要求:
相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。

【图1.png】
题目分析
1-10十个数字,要求天刀2*5的方格中。我们可以直接将所有的情况列举出来然后在判断是否符合条件,符合就count+1
解题思路

代码示例
楼主自己写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
#include<stdio.h> #define num 10 int count=0; void test(int x[]) { if(x[2]>x[1] && x[3]>x[2] && x[4]>x[3] && x[1]>x[0] && x[7]>x[6] && x[8]>x[7] && x[9]>x[8] && x[6]>x[5] && x[1]<x[6] && x[2]<x[7] && x[3]<x[8] && x[4]<x[9] && x[0]<x[5]) count++; } void f(int x[], int k) { int i,t; if(k>=num){ test(x); } for(i=k; i<num; i++){ {t=x[k]; x[k]=x[i]; x[i]=t;} f(x,k+1); {t=x[k]; x[k]=x[i]; x[i]=t;} } } int main() { int A[10]={1,2,3,4,5,6,7,8,9,10}; f(A,0); printf("%d\n", count); return 0; } |
网上一些比较优秀的代码分享
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> #define ll long long int map[2][5]; int vis[20]; int cnt; void check() { int i,j; for (i=0;i<5;i++) if (map[0][i]>map[1][i]) return; for (i=1;i<5;i++) if ((map[0][i-1]>map[0][i])||(map[1][i-1]>map[1][i])) return; for (i=0;i<2;i++) for (j=0;j<5;j++) printf("%d ",map[i][j]); printf("\n"); cnt++; } void dfs(int cur) { int i; if (cur==10) check(); for (i=0;i<10;i++) if (!vis[i]) { vis[i]=1; map[cur/5][cur%5]=i+1; dfs(cur+1); vis[i]=0; } } int main() { memset(vis,0,sizeof(vis)); dfs(0); printf("%d\n",cnt); return 0; } |
执行截图

本题所有附件 云盘下载
注意事项
1.熟练掌握全排列的写法
2.数组下标是从0开始的
3.判断是否符合的条件不要多加,不要漏写
第一排右大于左:x[2]>x[1] && x[3]>x[2] && x[4]>x[3] && x[1]>x[0]
第二排右大于左:x[7]>x[6] && x[8]>x[7] && x[9]>x[8] && x[6]>x[5]
上大于下:x[1]<x[6] && x[2]<x[7] && x[3]<x[8] && x[4]<x[9] && x[0]<x[5]
本次分享就到这里,如有兴趣请关注小文's blog
如果你有C语言难题可以在评论区留言,博主将在第二天为您讲解
如有任何意见请留言或者评论,本人一定采取。