HDU 1175 连连看
2012-09-07 10:20
183 查看
#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; }
相关文章推荐
- hdu 1175 连连看
- HDU1175 连连看
- hdu1175 连连看
- 【DFS】hdu 1175 连连看
- HDU - 1175 连连看
- hdu 1175 连连看
- 连连看(hdu 1175)用队列实现广搜,并加入了动态规划
- HDU 1175(连连看)
- HDU 1175 连连看 (BFS处理转折点)
- hdu 1175 连连看 (DFS)
- hdu 1175 连连看 DFS解法。用来入门DFS是不错的
- HDU_1175 连连看(DFS)
- 【HDU 1175 连连看】 + DFS + 减枝
- HDU 1175 连连看 (BFS带方向的判定)
- HDU 1175 连连看(BFS)
- hdu(1175)连连看
- hdu1175——连连看
- hdu 1175 连连看 (简单DFS)
- hdu 1175 连连看 dfs
- HDU-1175 连连看 BFS