蓝桥杯 2014_7 六角填数(任意数全排列)
2018-03-25 18:32
274 查看
思路:dfs 对剩下的数进行全排列,然后判断是否能满足条件
学到了 不仅仅可以对 i = 1,2,3,4,5这样的进行排列,稍微变换一下 即可对任意的数进行全排列
#include<stdio.h> 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<stdio.h> 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; }
相关文章推荐
- 蓝桥杯 2014预赛 六角填数 DFS
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第七题:六角填数【暴力】or【DFS】
- 2014六角填数蓝桥杯 dfs
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第7题:六角填数(12')
- 蓝桥杯 【六角填数】 全排列+dfs
- 【2014蓝桥杯】六角填数
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第7题:六角填数(12')
- 2014蓝桥杯C/C++初赛--猜年龄
- 2014 第五届蓝桥杯 06 奇怪的分式(java)
- 蓝桥杯 六角填数 (next_permutation/新技能)
- 蓝桥杯2014 真题 第一题
- 蓝桥杯-2014本科B-奇怪的分式
- 2014蓝桥杯C/C++初赛--蚂蚁感冒(程序设计)
- 2014 第五届蓝桥杯 04 大衍数列(java)
- 2013蓝桥杯C初赛求带分数(涉及全排列问题)
- 2014 蓝桥杯 蚂蚁感冒
- 蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第九题:地宫取宝(12') [ dp ]
- 2014蓝桥杯B组c/c++预赛 第九题地宫取宝 (四维线性dp)
- 2014蓝桥杯 地宫取宝 &&hdu 4597 四维数组状态记忆化