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;
}
标签:1043,ch,int,tt,路径,map1,Eight,include,HDOJ 来源: https://www.cnblogs.com/GarrettWale/p/11293858.html