博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
蓝桥杯 2014_7 六角填数(任意数全排列)
阅读量:4216 次
发布时间:2019-05-26

本文共 1318 字,大约阅读时间需要 4 分钟。

思路:dfs 对剩下的数进行全排列,然后判断是否能满足条件
#include
bool vis[13];int a[13];int num[9]= {2,4,5,6,7,9,10,11,12};bool judge(int *a) { int t1 = a[1] +a[2] + a[3] + 8; int t2 = a[4] + a[7] + 3 + 8; int t3 = 1 + a[1] + a[4] + a[6]; int t4 = 1 + a[2] + a[5] + a[9]; int t5 = a[6] + a[7] + a[8] + a[9]; int t6 = a[3] + a[5] + a[8] + 3; if(t1 == t2 && t2 == t3 && t3 == t4 && t4 == t5 && t5 == t6)//巧妙比较6个数相等 return true;// for(int i = 0; i < 6; ++i){// for(int j = i+1; j < 6; ++j){// if(t[i] != t[j])// return false;// }// } return false; }void dfs(int pos) { if(pos == 10){ if(judge(a)){ printf("%d\n",a[4]); return ; } return ; } for(int i = 0; i < 9; ++i){ if(!vis[num[i]]){ vis[num[i]] = true; a[pos] = num[i]; dfs(pos+1); vis[num[i]] = false; } } }int main() { dfs(1); return 0; }

学到了 不仅仅可以对 i = 1,2,3,4,5这样的进行排列,稍微变换一下 即可对任意的数进行全排列
#include
bool vis[13];int a[13];int num[5]= {2,4,5,6,7};//这个数组保存了待全排列的数void dfs(int pos) { if(pos == 5){//若以下标为0开始 则 pos到达元素位数即可终止了 for(int i = 0; i < 5; ++i){ printf("%3d",a[i]); } printf("\n"); return ; } for(int i = 0; i < 5; ++i){ if(!vis[num[i]]){//关键在这里 vis[num[i]] = true; a[pos] = num[i];//这里不在是i而是num[i] dfs(pos+1); vis[num[i]] = false; } } } int main() { dfs(0); return 0; }

转载地址:http://aqimi.baihongyu.com/

你可能感兴趣的文章
Android (Linux) Suspend流程
查看>>
LINUX时间管理
查看>>
定时器的使用
查看>>
为Android加入busybox工具
查看>>
使用技巧busybox
查看>>
如何查看与/dev/input目录下的event对应的设备
查看>>
bootloader-bootable解析
查看>>
bootloader (LK)&&android lk bootloader中相关修改指南
查看>>
SD卡驱动分析--基于高通平台
查看>>
SD Card 驱动流程分析
查看>>
Linux之debugfs介绍
查看>>
关于sd卡中一些概念的理解
查看>>
sd卡驱动分析之相关硬件操作和总结
查看>>
好的播文
查看>>
linux dd命令解析
查看>>
linux find命令详解
查看>>
S3C2440上touchscreen触摸屏驱动
查看>>
USB History Viewing
查看>>
怎样做可靠的分布式锁,Redlock 真的可行么?
查看>>
[图文] Seata AT 模式分布式事务源码分析
查看>>