您的位置:首页 > 其它

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