HDU 1175 连连看(广搜)
2013-04-15 21:35
204 查看
一开始代码判重的时候有缺陷,在调整搜索顺序的时候AC了,改别的顺序又继续WA到死.后来发现时判断当前状态是否加入时没加等号,还是太弱了~
思路就是跑到当前点时选拐点最少的。
思路就是跑到当前点时选拐点最少的。
#include <cstdio> #include <iostream> #include <queue> #include <cstring> using namespace std; const int maxn=1000+5; int n,m; int a[maxn][maxn],sum[maxn][maxn]; int dir[4][2]= {{1,0},{0,-1},{0,1},{-1,0}}; struct node { int x,y,p,num; }; int x1,x2,y1,y2; bool bfs() { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) sum[i][j]=10; queue<node>q; node cur,next; cur.x=x1,cur.y=y1; cur.p=-1;cur.num=0; q.push(cur); sum[cur.x][cur.y]=0; while(!q.empty()) { cur=q.front(); q.pop(); for(int i=0; i<4; i++) { next=cur; next.x+=dir[i][0]; next.y+=dir[i][1]; if(next.x<=0||next.x>n||next.y<=0||next.y>m) continue; if(next.p!=i) next.num++; next.p=i; if(next.num>3) continue; if(next.x==x2&&next.y==y2) return true; if(a[next.x][next.y]!=0) continue; if(next.num<=sum[next.x][next.y]) { q.push(next); sum[next.x][next.y]=next.num; } } } return false; } int main() { while(~scanf("%d%d",&n,&m),n||m) { for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) scanf("%d",&a[i][j]); int q; scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(a[x1][y1]!=a[x2][y2]||a[x1][y1]==0||(x1==x2)&&(y1==y2)) { printf("NO\n"); continue; } if(bfs()) printf("YES\n"); else printf("NO\n"); } } return 0; }
相关文章推荐
- HDU 1175 连连看
- HDU 1175 连连看
- HDU 1175 连连看 BFS
- hdu 1175 连连看
- HDU 1175 连连看 (搜索 DFS)
- hdu 1175 连连看(模拟循环队列)
- HDU-#1175 连连看(DFS+剪枝)
- hdu 1175 连连看 DFS
- hdu 1175 连连看 (深搜)
- hdu 1175 连连看
- hdu 1175 连连看(BFS的搜索方向与效率问题)
- HDU 1175 连连看
- [HDU] 1175 连连看 - 剪枝优化后的性能飙升
- hdu 1175 连连看(BFS)
- HDU-1175-连连看
- HDU 1175 连连看
- 【hdu 1175】 连连看 题解 (c++)
- hdu 1175 连连看
- HDU 1175 连连看 DFS
- hdu 1175 连连看 搜索—dfs