//if(!v[i]){//一直忘记把这个条件写上! 类似于全排列
//有一个疑问,这类深度搜索为什么不需要返回
//看看这一题怎么用深度搜索代替全排列的
#include<cstdio>
int a[13],v[13]={0},t[6];
int sum(int a1,int a2,int a3,int a4){
return a[a1]+a[a2]+a[a3]+a[a4];
}
bool test(){
t[0]=sum(1,3,6,8);
t[1]=sum(1,4,7,11);
t[2]=sum(8,9,10,11);
t[3]=sum(2,6,9,12);
t[4]=sum(5,7,10,12);
t[5]=sum(2,3,4,5);
for(int i=1;i<6;i++){
if(t[i]!=t[i-1]) return false;
}
return true;
}
void show(){
for(int i=1;i<=12;i++){
printf("%d%c",a[i],i==12?'\n':' ');
}
}
void DFS(int m){
if(m==12){
if(test()) show(); return;//这里一定记得return ,否则不出结果的
}
/*if(m==1||m==2||m==12) {
DFS(m+1);
return ;//并不知道return什么时候加
}*/
for(int i=2;i<=12;i++){//决定当前m位的数
if(i==3||i==8) {
//m++;
continue;
}
if(!v[i]){//一直忘记把这个条件写上!
a[m]=i;
v[i]=1;
DFS(m+1);
v[i]=0;
}
}
}
int main(){
a[1]=1;
a[2]=8;
a[12]=3;
DFS(3);//当前从第三个开始考虑
return 0;
}
别人的代码,可以做模板用了。。点击打开链接
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
#define eps 10e-10
#define N 15
int a[N];
bool vis[N];
void dfs(int x){
if(x == 1 || x == 2 || x == 12){
dfs(x+1);
return ;
}
if(x > 12){
int t[6];
t[0] = a[1] + a[3] + a[6] + a[8];
t[1] = a[1] + a[4] + a[7] + a[11];
t[2] = a[2] + a[3] + a[4] + a[5];
t[3] = a[2] + a[6] + a[9] + a[12];
t[4] = a[8] + a[9] + a[10] + a[11];
t[5] = a[12] + a[10] + a[7] + a[5];
for(int i = 1; i < 6; ++i){
if(t[i] != t[i-1])return ;
}
cout<<a[6]<<endl;
return ;
}
for(int i = 1;i < 13; ++i){
if(!vis[i]){
vis[i] = 1;
a[x] = i;
dfs(x+1);
vis[i] = 0;
}
}
}
int main(){
memset(vis,0,sizeof(vis));
vis[1] = 1;
a[1] = 1;
vis[8] = 1;
a[2] = 8;
vis[3] = 1;
a[12] =3;
dfs(1);
return 0;
}

本文探讨了如何使用深度搜索算法替代全排列,并优化了特定条件下的算法实现,通过实例展示了深度搜索在解决组合问题时的优势。
1134

被折叠的 条评论
为什么被折叠?



