hdu 1254 、1175
2011-05-15 15:11
302 查看
两道搜索的题目,难度应该还差不多。。
1254推箱子有一点很重要,如果判断cur是不是目标点的话会超时,需要判断next是不是目标点。
即:
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur==目标点) return 1;
............
}
这样会超时的,需要在把next加入队列的时候就判断它是不是目标点。,这点需要注意。。
1175连连看需要用到两个visit数组, 因为访问到该节点时有可能是竖直方向过来的,也有可能是水平方向过来的,需要用两个visit数组,分别记录在两个方向上的最小值。
贴下1175代码:
1254推箱子有一点很重要,如果判断cur是不是目标点的话会超时,需要判断next是不是目标点。
即:
while(!q.empty())
{
cur=q.front();
q.pop();
if(cur==目标点) return 1;
............
}
这样会超时的,需要在把next加入队列的时候就判断它是不是目标点。,这点需要注意。。
1175连连看需要用到两个visit数组, 因为访问到该节点时有可能是竖直方向过来的,也有可能是水平方向过来的,需要用两个visit数组,分别记录在两个方向上的最小值。
贴下1175代码:
# include<stdio.h> # include<math.h> # include<string.h> # include<queue> # define N 1005 using namespace std; struct node{ int x,y,step; bool operator <(const node &a)const { return a.step<step; } int cp; }; int n,m,map ,xx1,yy1,xx2,yy2; int visit1 ;//表示竖直方向上的 int visit2 ;//表示水平方向上的 int dir[4][2]={1,0,-1,0,0,-1,0,1}; int is(int x,int y) { if(x>=1 && x<=n && y>=1 && y<=m ) { return 1; } return 0; } int bfs() { int i; queue<node>q; node cur,next; cur.x=xx1; cur.y=yy1; cur.step=0; cur.cp=-1; q.push(cur); visit1[cur.x][cur.y]=0; visit2[cur.x][cur.y]=0; while(!q.empty()) { cur=q.front(); q.pop(); for(i=0;i<4;i++) { next=cur; next.x+=dir[i][0]; next.y+=dir[i][1]; if(next.cp==-1) next.cp=fabs(dir[i][0]); else if(next.cp!=fabs(dir[i][0])) { next.cp=fabs(dir[i][0]); next.step++; } if(next.step>2) continue; if(is(next.x,next.y)) { if(next.x==xx2 && next.y==yy2) return 1; if(map[next.x][next.y]!=0) continue; if(fabs(next.x-xx2)!=0 && fabs(next.y -yy2)!=0 && next.step==2) continue; if(next.cp==0) { if(visit1[next.x][next.y]==-1 || next.step<visit1[next.x][next.y]) { visit1[next.x][next.y]=next.step; q.push(next); } } else { if(visit2[next.x][next.y]==-1 || next.step< visit2[next.x][next.y]) { visit2[next.x][next.y]=next.step; q.push(next); } } } } } return -1; } int main() { int i,j,q,ans; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0 && m==0) break; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&map[i][j]); scanf("%d",&q); while(q--) { scanf("%d%d%d%d",&xx1,&yy1,&xx2,&yy2); if(map[xx1][yy1]==0 || map[xx2][yy2]==0 ||map[xx1][yy1]!=map[xx2][yy2]) {printf("NO\n");continue;} memset(visit1,-1,sizeof(visit1)); memset(visit2,-1,sizeof(visit2)); ans=bfs(); if(ans==-1) printf("NO\n"); else printf("YES\n"); } } return 0; }
相关文章推荐
- HDU 1175 连连看
- hdu 1254-推箱子
- HDU 1254-推箱子
- HDU 1175 连连看(BFS或DFS)
- HDU 1254推箱子(bfs+dfs)
- HDU - 1254 推箱子(BFS+优先队列)
- hdu 1175 连连看
- HDU-1175 连连看 BFS
- hdu 1175 连连看
- HDU 1175
- HDU-1175 连连看 DFS
- hdu 1175 连连看
- hdu 1175 连连看 DFS解法。用来入门DFS是不错的
- 【DFS】hdu 1175 连连看 stack
- HDU 1175 连连看
- HDU 1175 连连看 (棋盘的走法)
- hdu 1175 连连看
- hdu 1254 推箱子
- hdu 1175 连连看(BFS)
- hdu 1175 连连看