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