hdu 1175 连连看
2013-07-18 14:57
246 查看
链接:点击打开链接
用一个数记上一步的方向,然后与当前方向比较,不同则转弯啦,count++,相同不变。两个棋子之间的连线不能有其他棋子,而且起点终点相同,也不能消,起点,终点,没有棋子,也是NO。
还有一种是和hdu 1728 逃离迷宫一样的思路,哎,水,自己应该是判断条件错啦,华丽丽的WA啦。又找不出哪里错啦。真心是一个思路。。。
用一个数记上一步的方向,然后与当前方向比较,不同则转弯啦,count++,相同不变。两个棋子之间的连线不能有其他棋子,而且起点终点相同,也不能消,起点,终点,没有棋子,也是NO。
还有一种是和hdu 1728 逃离迷宫一样的思路,哎,水,自己应该是判断条件错啦,华丽丽的WA啦。又找不出哪里错啦。真心是一个思路。。。
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define INF 0x3f3f3f struct node{ int x; int y; int count; int z; }; int n,m,x1,y1,x2,y2,a[4][2]={-1,0,1,0,0,1,0,-1}; int str[1100][1100]; int vis[1100][1100]; int bfs(){ int i; if((x1==x2&&y1==y2)||!str[x1][y1]||!str[x2][y2]||str[x1][y1]!=str[x2][y2]) return 0; queue<node>Q; node p,q; memset(vis,INF,sizeof(vis)); p.x=x1; p.y=y1; p.z=-1; p.count=0; vis[p.x][p.y]=0; for(i=0;i<4;i++){ q=p; q.x=p.x+a[i][0]; q.y=p.y+a[i][1]; if(q.x>0&&q.x<=n&&q.y>0&&q.y<=m&&q.count<=2){ if(q.x==x2&&q.y==y2) return 1; q.z=i; if(!str[q.x][q.y]){ vis[q.x][q.y]=0; Q.push(q); } } } while(!Q.empty()){ p=Q.front(); Q.pop(); for(i=0;i<4;i++){ q=p; q.x=p.x+a[i][0]; q.y=p.y+a[i][1]; q.z=i; if(p.z!=q.z) q.count++; if(q.x>0&&q.x<=n&&q.y>0&&q.y<=m&&q.count<=2&&q.count<=vis[q.x][q.y]){ if(q.x==x2&&q.y==y2) return 1; if(!str[q.x][q.y]){ vis[q.x][q.y]=q.count; Q.push(q); } } } } return 0; } int main(){ int i,j,q; while(~scanf("%d %d",&n,&m)){ if(n==0&&m==0) break; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&str[i][j]); scanf("%d",&q); for(i=0;i<q;i++){ scanf("%d %d %d %d",&x1,&y1,&x2,&y2); if(bfs()) printf("YES\n"); else printf("NO\n"); } } return 0; }
相关文章推荐
- HDU 1175 连连看
- hdu 1175 连连看 (深搜)
- HDU 1175 连连看(BFS或DFS)
- HDU 1175 连连看 (搜索,dfs)
- hdu 1175 连连看
- HDU 1175 连连看 BFS
- hdu 1175 连连看
- hdu 1175——连连看
- HDU 1175 连连看 DFS+搜索+方向
- HDU 1175 连连看(dfs,bfs)
- hdu 1175 连连看 java (BFS + 一搜到底)
- hdu 1175 连连看(搜索)
- HDU 1175 连连看 (DFS)
- hdu 1175 连连看 dfs
- HDU 1175 连连看(dfs+剪枝)
- HDU 1175 连连看
- hdu1175——连连看
- hdu 1175 连连看(DFS)
- HDU 1175 连连看
- hdu 1175 连连看 DFS