码迷,mamicode.com
首页 > 其他好文 > 详细

HDOJ-1043 Eight

时间:2019-08-03 11:14:50      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:输入   判断   std   ret   越界   pause   ring   turn   tor   

bfs搜索加记录路径

HDOJ-1043

  • 我的这题没有AC过,提交时总提示Runtime Error,但是我检查了数组的大小,似乎不是数组越界的问题。样例可以过
  • 主要思路就是使用广度优先搜索,找最短路径。然后记录路径,找到结果是打印出来。
  • 我使用了一个set用来判断是否遍历过,其实也可以不用的,因为我也是用了map来达到记录路径的作用,这里可以做到判断是否遍历的目的。
  • 打印路径推荐使用vector最后需要使用algorithm里的reverse进行路径的翻转。
  • 注意本题有多组输入,这里的输入需要注意一下。
  • 如果题目没有要求最短路径,那么使用深搜的话也可以记录路径,这里也给出了代码。
#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;
}

HDOJ-1043 Eight

标签:输入   判断   std   ret   越界   pause   ring   turn   tor   

原文地址:https://www.cnblogs.com/GarrettWale/p/11293858.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!