其他分享
首页 > 其他分享> > HDOJ-1043 Eight

HDOJ-1043 Eight

作者:互联网

bfs搜索加记录路径

HDOJ-1043

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<set>
#include<vector>
#include<map>
using namespace std;
char tile[9];
struct node{
    char dirs;
    int x;
    int y;
    string tt;//字符串表示
    node(){}
    node(int xx,int yy,string s):x(xx),y(yy),tt(s){}
};
map<string,node> mp;
int map1[3][3];
set<string> vis;
string tt;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char dirtion[4]={'u','d','l','r'};
bool flag=false;
vector<char> v;
vector<char> v1;
string cal(int a[3][3]){
    string ss="";
    for(int i=0;i<3;i++){
        for(int j=0;j<3;j++){
            if(a[i][j]==-1)
            ss+='x';
            else ss+=('0'+a[i][j]);
        }
    }
    return ss;
}
void printanswer(string end,string start,char endch){
    if(!flag)
        cout<<"unsolvable"<<endl;
    else{
        //cout<<"true"<<endl;
        while(end!=start){
        v.push_back(mp[end].dirs);
        end=mp[end].tt;
        }
        v.pop_back();
        reverse(v.begin(),v.end());
        for(vector<char>::iterator it=v.begin();it!=v.end();it++){
            cout<<*it;
        }
        cout<<endch<<endl;
    }
    
}
bool in(int x,int y){
    return x>=0&&x<3&&y>=0&&y<3;
}
void dfs(int sx,int sy,string t){
    //cout<<t<<endl;
    if(flag)
        return;
    if(t=="12345678x"){
        flag=true;
        v1=v;
        return;
    }
    for(int i=0;i<4;i++){
        int tx=sx+dir[i][0];
        int ty=sy+dir[i][1];
        if(in(tx,ty)){
             string nows=t;
             nows[tx*3+ty]='x';
             nows[sx*3+sy]=t[tx*3+ty];
             if(!vis.count(nows)){
                 vis.insert(nows);
                 v.push_back(dirtion[i]);
                 dfs(tx,ty,nows);
                 v.pop_back();
             }
        }
    }
}
void bfs(int sx,int sy,string t){
    queue<node> q;
    node sta(sx,sy,t);
    q.push(sta);
    sta.dirs='N';
    //mp[t]=sta;
    while(!q.empty()){
        node temp=q.front();
        //cout<<temp.tt<<endl;
        q.pop();
        if(temp.tt=="12345678x"){
            flag=true;
            printanswer(temp.tt,t,temp.dirs);
            return;
        }
        for(int i=0;i<4;i++){
        int tx=temp.x+dir[i][0];
        int ty=temp.y+dir[i][1];
        if(in(tx,ty)){
             string nows=temp.tt;
             nows[tx*3+ty]='x';
             nows[temp.x*3+temp.y]=temp.tt[tx*3+ty];
             if(!vis.count(nows)){
                vis.insert(nows);
                node now;
                now.x=tx,now.y=ty,now.tt=nows;
                now.dirs=dirtion[i];
                mp[nows]=temp;
                q.push(now);
             }
        }
    }
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    char ch;
    while(cin>>ch){
     vis.clear();
    v.clear();
    flag=false;
    mp.clear();
    int x,y;
    if(ch=='x'){
        map1[0][0]=-1;
        x=0,y=0;
    }else
    {
        map1[0][0]=ch-'0';
    }
    for(int i=1;i<9;i++){
        cin>>ch;
        if(ch=='x'){
            map1[i/3][i%3]=-1;
            x=i/3,y=i%3;
        }
        else {
            map1[i/3][i%3]=ch-'0';
        }
    }
    tt=cal(map1);
    if(tt=="12345678x"){
        cout<<endl;
        return 0;
    }
    vis.insert(tt);
    bfs(x,y,tt);  
    }
    //system("pause");
    return 0;
}

标签:1043,ch,int,tt,路径,map1,Eight,include,HDOJ
来源: https://www.cnblogs.com/GarrettWale/p/11293858.html