HDOJ-1043 Eight

Posted garrettwale

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ-1043 Eight相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章