当前位置:编程学习 > C/C++ >>

HDOJ2188 哈密顿绕行世界问题(DFS)

 


标准的DFS,用STL里的stack可简便地完成。


[cpp]
/*HDOJ2188
作者:陈佳润
2013-04-12
*/ 
#include<iostream>  
#include<stack>  
using namespace std; 
 
int Case; 
stack<int> S; 
int map[22][5];//记录数据  
int used[22];//标记是否走过  
int start;//记录起点  
 
void DFS(){ 
    int top,i; 
    if(S.size()>21)//如果经过的地点超过21个,则退出  
        return; 
    if(S.top()==start && (S.size()<21&&S.size()!=1))//如果遇到起点,但不是终点,则退出  
        return; 
    if(S.size()==21 && S.top()==start){//如果遇到终点  
        int temp[22]; 
        for(i=21;i>0;i--){ 
            temp[i]=S.top(); 
            S.pop(); 
        } 
        //输出  
        cout<<Case<<":  "; 
        for(i=1;i<=21;i++){ 
            cout<<temp[i]; 
            if(i!=21) 
                cout<<" "; 
        } 
        cout<<endl; 
        for(i=1;i<=21;i++){ 
            S.push(temp[i]); 
        } 
        Case++; 
        return; 
    } 
    top=S.top(); 
    for(i=1;i<=3;i++){ 
        if(!used[map[top][i]]){ 
            used[map[top][i]]=1;//标志已经有了  
            S.push(map[top][i]);//入栈  
            DFS();//递归  
            used[map[top][i]]=0;//去除标志  
            S.pop();//出栈  
        } 
    } 

 
int main(){ 
    int i; 
    //freopen("1.txt","r",stdin);  
    while(cin>>map[1][1] && map[1][1]){ 
        cin>>map[1][2]>>map[1][3]; 
        for(i=2;i<=20;i++) 
            cin>>map[i][1]>>map[i][2]>>map[i][3]; 
        cin>>start; 
        for(i=1;i<=20;i++)//初始化  
            used[i]=0; 
        S.push(start); 
        Case=1; 
        DFS(); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,