HDU 1175 连连看

来源:互联网 发布:卡硬 知乎 编辑:程序博客网 时间:2024/05/24 15:38
#include<stdio.h>#include<iostream>#include<queue>using namespace std;struct ss{int x,y;int num,di;//di记录上次的方向}en,st;int map[1001][1001];int r[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int mark[1001][1001];int n,m,ex,ey,sx,sy;bool judge(int x,int y){if(x>0&&x<=n&&y>0&&y<=m&&(!map[x][y]||x==ex&&y==ey))return true;return false;}bool BFS(){queue<ss>Q;Q.push(st);ss p,s;int i;while(!Q.empty()){p=Q.front();Q.pop();if(p.x==ex&&p.y==ey)return true;for(i=0;i<4;i++){s=p;s.x+=r[i][0];s.y+=r[i][1];if(s.di==-1){s.di=i;s.num=0;}else if(s.di!=i){s.num++;s.di=i;}if(s.num>2)continue;if(judge(s.x,s.y)){if(mark[s.x][s.y]>s.num){Q.push(s);mark[s.x][s.y]=s.num;}}}}return false;}int main(){int i,j,w;while(scanf("%d %d",&n,&m),n){for(i=1;i<=n;i++)for(j=1;j<=m;j++)scanf("%d",&map[i][j]);scanf("%d",&w);while(w--&&scanf("%d %d %d %d",&sx,&sy,&ex,&ey)){if(map[sx][sy]!=map[ex][ey]||!map[sx][sy]||(sx==ex&&sy==ey)){printf("NO\n");continue;}for(i=1;i<=n;i++)for(j=1;j<=m;j++)mark[i][j]=9999999;st.x=sx;st.y=sy;st.di=-1;st.num=0;if(BFS()) printf("YES\n");else printf("NO\n");}}return 0;}

原创粉丝点击