hdu_1175_BFS+剪枝_用转弯次数来限定

来源:互联网 发布:百度网盘mac 编辑:程序博客网 时间:2024/06/05 18:27

先贴代码,明天再补上说明

#include<iostream>#include<cstring>#include<algorithm>#include<queue>#include<stdio.h>using namespace std;const int maxn=1000;int map[maxn][maxn],visit[maxn][maxn];int dir[4][2]={1,0,-1,0,0,1,0,-1};int n,m;int sx,sy,ex,ey;struct Node{    int x,y;    int turn; //标示转移方向};bool judge(int x,int y) //说明可以进行走动,转向{    return x>=1&&y>=1&&x<=n&&y<=m&&map[x][y]==0;}bool bfs(int x,int y){    //这才是到了关键    queue<Node> q;    Node first,next;    first.x=x,first.y=y,first.turn=1; //这里用自己的方式标记方向    q.push(first);    while(!q.empty())    {        first=q.front();        q.pop();        for(int i=0;i<4;i++)        {            next.x=first.x+dir[i][0];            next.y=first.y+dir[i][1];            if(next.x==ex&&next.y==ey) return true;            while(judge(next.x,next.y)) //保证下一点是可以走的            {                next.turn=first.turn+1;                if(visit[next.x][next.y]==0 && next.turn<4) //只是一个表达式的计算而已                    {                        q.push(next);                        visit[next.x][next.y]=1;                    }                next.x+=dir[i][0];                next.y+=dir[i][1];                if(next.x==ex&&next.y==ey) return true;            }        }    }    return false;}int main(void){    int i,j,k;    int query;//查询,这个关键词定义的好    while(cin>>n>>m)    {        if(n==0&&m==0) break;        for(i=1;i<=n;i++)            for(j=1;j<=m;j++)            cin>>map[i][j];        cin>>query;        while(query--)        {            memset(visit,0,sizeof(visit));            cin>>sx>>sy>>ex>>ey;            if(map[sx][sy]==0 || map[ex][ey]==0 || map[sx][sy]!=map[ex][ey])                printf("NO\n");            else printf("%s\n",bfs(sx,sy)?"YES":"NO");        }    }}


0 0
原创粉丝点击