您的位置:首页 > 其它

蓝桥杯 2014_7 六角填数(任意数全排列)

2018-03-25 18:32 274 查看
思路:dfs 对剩下的数进行全排列,然后判断是否能满足条件
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: