3 4 1 2 3 4 0 0 0 0 4 3 2 1 4 1 1 3 4 1 1 2 4 1 1 3 3 2 1 2 4 3 4 0 1 4 3 0 2 4 1 0 0 0 0 2 1 1 2 4 1 3 2 3 0 0
YES NO NO NO NO YES
bfs,一个点可以走多次,每次搜到一个点后,看当前拐弯数是否小于以前走过的,若小于才入队。
加上这个优化可以把程序从超时拯救到93MS!!!
#include"stdio.h"
#include"string.h"
#include"queue"
#include"vector"
using namespace std;
#define N 1005
#define M 1000000
int g[N][N];
int mark[N][N];
int n,m,x1,x2,y1,y2;
int dir[4][2]={0,1,0,-1,-1,0,1,0};
struct node
{
int x,y,d,mov;
}p[M];
int judge(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=m)
return 1;
return 0;
}
int bfs()
{
int i,l,r,x,y;
l=r=0;
for(i=0;i<4;i++)
{
p[r].x=x1;
p[r].y=y1;
p[r].d=i;
p[r++].mov=0;
}
while(l!=r)
{
for(i=0;i<4;i++)
{
x=p[r].x=p[l].x+dir[i][0];
y=p[r].y=p[l].y+dir[i][1];
if(judge(x,y)==0)
continue;
p[r].d=i;
p[r].mov=p[l].mov;
if(p[l].d!=i)
p[r].mov++;
if(x==x2&&y==y2&&p[r].mov<=2)
return 1;
if(g[x][y]==0&&p[r].mov<mark[x][y])
{ //优化很显著啊,93MS
mark[x][y]=p[r].mov;
r++;
}
if(r>=M)
r=0;
}
l++;
if(l>=M)
l=0;
}
return 0;
}
int main()
{
int i,j,q;
while(scanf("%d%d",&n,&m),n||m)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&g[i][j]);
}
}
scanf("%d",&q);
while(q--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(g[x1][y1]!=g[x2][y2]||g[x1][y1]==0) //优化,
{
printf("NO\n");
continue;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mark[i][j]=3;
if(bfs()) //因为把这一行写成if(bfs)错了n++次,而且还过样例,真是被坑死了
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
hdu 1175 连连看(模拟循环队列),布布扣,bubuko.com
原文:http://blog.csdn.net/u011721440/article/details/38424907