1. 程式人生 > >hdu1728 逃離迷宮(BFS)

hdu1728 逃離迷宮(BFS)

題意:經典的迷宮問題的基礎上,條件是轉彎次數的限制,最多k次轉彎。

對於這種情況,使用BFS不再是每次添加當前位置周圍1步的點,而是將除了走過的以外三個方向上所有的點放入佇列。跳入的坑比較多,因為懶,所以沒有重新寫,總是在之前的上面修修補補。新增點的時候,同一方向上,遇到*停止這個方向的新增,但是遇到新增過的點跳過這個點不新增,但繼續向前。

#include<iostream>
#include<queue>
using namespace std;
int m,n;
int map[110][110];
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
struct local
{
    int x;
    int y;
    int state;
    int k;
};
bool bfs(int x1,int y1,int x2,int y2,int k)
{
    queue<local>q;
    local a;
    a.x=x1;
    a.y=y1;
    a.state=10;
    a.k=k;
    q.push(a);
    map[a.x][a.y]=2;
    while(!q.empty())
    {
	a=q.front();
	local t;
//	cout<<a.x<<' '<<a.y<<endl;
	q.pop();
	if(a.x==x2&&a.y==y2) return true;
	for(int i=0;i<4;i++)
	{
	    if(a.state-i==2||i-a.state==2) continue;
	    if(a.x+dir[i][0]<0||a.x+dir[i][0]>=m) continue;
            if(a.y+dir[i][1]<0||a.y+dir[i][1]>=n) continue;
	    if(map[a.x+dir[i][0]][a.y+dir[i][1]]==1) continue;
	    t.x=a.x+dir[i][0];
	    t.y=a.y+dir[i][1];
	    t.k=a.k;
	    t.state=i;
	    if(a.state!=i)
	    {
		t.k--;
	    }
	    if(t.k<0) continue;
	    if(map[t.x][t.y]==0) q.push(t);
	    map[t.x][t.y]=2;
	    if(t.x+dir[i][0]<0||t.x+dir[i][0]>=m) continue;
            if(t.y+dir[i][1]<0||t.y+dir[i][1]>=n) continue;
	    while(map[t.x+dir[i][0]][t.y+dir[i][1]]!=1)
	    {

		t.x+=dir[i][0];
		t.y+=dir[i][1];
		if(map[t.x][t.y]==0)q.push(t);
		map[t.x][t.y]=2;
		if(t.x+dir[i][0]<0||t.x+dir[i][0]>=m) break;
            	if(t.y+dir[i][1]<0||t.y+dir[i][1]>=n) break;
	    }
	}
    }
    return false;
}
int main()
{
    int tt;
    cin>>tt;
    while(tt--)
    {
        cin>>m>>n;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                char ch;
                cin>>ch;
                if(ch=='.') map[i][j]=0;
                else map[i][j]=1;
//		cout<<map[i][j];
            }
//	    cout<<endl;
        }
        int x1,y1,x2,y2,k;
        cin>>k>>y1>>x1>>y2>>x2;
        if(bfs(x1-1,y1-1,x2-1,y2-1,k+1)) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
}