蓝桥杯 2014预赛 六角填数 DFS

//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;
}


你可能感兴趣的:(DFS)