您的位置:首页 > 其它

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代码:

# 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: