HDU 1728

http://acm.hdu.edu.cn/showproblem.php?pid=1728

汉语题目  

给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位置,只能走到与它相邻的4个位置中,当然在行走过程中,gloria不能走到迷宫外面去。令人头痛的是,gloria是个没什么方向感的人,因此,她在行走过程中,不能转太多弯了,否则她会晕倒的。我们假定给定的两个位置都是空地,初始时,gloria所面向的方向未定,她可以选择4个方向的任何一个出发,而不算成一次转弯。gloria能从一个位置走到另外一个位置吗?
 

本来还以为是一道普通的bfs   只是比普通的加了个条件  没想到WA后还是WA啊

关键 访问过后不能标记为* 因为有的点可能不止访问一次     visit[][]记录该点的最少访问次数  如果该点存在更少的转弯次数的路径 该点还可以加入队列 

既不会死循环 又保证转弯最少


受HDU1242的影响 ,想用priority_queue按转弯次数从小到大排列 但老是WA,原来WA是正确的 不能那样做,

如果用最小优先队列的话 转弯次数相同的就有问题了  涉及到先后出队及走过做标记的问题 具体的画了一个图

把那个有错误意义的代码也贴一下


正确代码

 

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
char map[102][102];
int visit[102][102];
int bx,by,ex,ey,step,N,M;
int XX[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{int x,y,step,dir;};


void bfs()
{
queue<node>qu;
node t;
int k;
t.x=bx, t.y=by, t.step=0, t.dir=-1;
visit[bx][by]=0;
qu.push(t) ;
while(!qu.empty())
{
t=qu.front();
qu.pop();
for(k=0;k<4;k++)
{
node tt=t;
tt.x+=XX[k][0], tt.y+=XX[k][1];
if(tt.x<1||tt.x>M||tt.y<1||tt.y>N||map[tt.x][tt.y]=='*')
continue;
if(tt.dir!=k&&tt.dir!=-1)tt.step++;
if(tt.step>step)continue;//!!!
if(tt.x==ex&&tt.y==ey)
{
cout<<"yes\n";return;
}
if(visit[tt.x][tt.y]>=tt.step)
{ tt.dir=k;
visit[tt.x][tt.y]=tt.step;
qu.push(tt);
}

}
}
cout<<"no\n";
return ;
}
int main()
{
int CASE,i,j;
cin>>CASE;
while(CASE--)
{
cin>>M>>N;//M行 N列
for(i=1;i<=M;i++)
for(j=1;j<=N;j++)
{
cin>>map[i][j];
visit[i][j]=999;
}

cin>>step>>by>>bx>>ey>>ex;//x对应列
if(bx==ex&&by==ey)
{cout<<"yes\n"; continue;}

bfs();

}
return 0;
}

有错误意义的最小优先队列代码

 

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int m,n,bx,by,ex,ey,T;
int XX[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char map[102][102];
struct node
{
int x,y,step,dir;
friend bool operator <(node t1,node t2)
{
return t1.step>t2.step;
}

};
void bfs()
{
int k,mark;
priority_queue<node>qu;
node t;
t.x = bx, t.y=by, t.step=0, t.dir=-1;
qu.push(t);
while(!qu.empty())
{
t = qu.top();
qu.pop();
for(k=0;k<4;k++)
{ node tt=t;
tt.x+=XX[k][0], tt.y+=XX[k][1];
if(tt.x<1||tt.x>m||tt.y<1||tt.y>n||map[tt.x][tt.y]=='*')
continue;
if(tt.dir!=k&&tt.dir!=-1)tt.step++;
if(tt.step>T)continue;

if(tt.x==ex&&tt.y==ey)
{
cout<<"yes"<<endl; return;
}
tt.dir=k;
map[tt.x][tt.y]='*';
qu.push(tt);

}

}
cout<<"no"<<endl;
return ;
}

int main()
{
int CASE,j,i;
cin>>CASE;
while(CASE--)
{
cin>>m>>n;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
cin>>map[i][j];
cin>>T>>by>>bx>>ey>>ex;
if(map[ex][ey]=='*')
{
cout<<"no"<<endl;//!!!
continue;
}
bfs();
}
return 0;
}




posted @ 2011-11-29 21:08  快乐.  阅读(478)  评论(0编辑  收藏  举报