天天看点

hdu1175 连连看

#include<iostream>

#include<queue>

using namespace std;

int n,m;

int map[1005][1005];

typedef struct s_e

{

int x,y,f,c;

};

s_e start,end;

int d[4][2]={​{1,0},{0,1},{-1,0},{0,-1}};

int visited[1005][1005];

int BFS(s_e s)

{

queue <s_e>q;

q.push(s); visited[s.x][s.y]=0;

while(!q.empty())

{

s_e temp; temp=q.front();

q.pop();

// if(temp.c>2) continue;

if(temp.x==end.x&&temp.y==end.y&&temp.c<=2) return 1;

for(int i=0;i<4;i++)

{

s_e now ;

now.x=temp.x+d[i][0];

now.y=temp.y+d[i][1];

now.f=i;

now.c=temp.c;

if(now.x>=0&&now.x<n&&now.y>=0&&now.y<m&&(now.x==end.x&&now.y==end.y||map[now.x][now.y]==0))

{

if(now.f!=temp.f)

{

now.c=temp.c+1;

if(now.c>2) continue;

if(visited[now.x][now.y]>=now.c)

{

visited[now.x][now.y]=now.c;

q.push(now);

}

}

else

{

if(visited[now.x][now.y]>=now.c)

{

visited[now.x][now.y]=now.c;

q.push(now);

}

}

}

}

}

return 0;

}

int main()

{

int i,j,k;

while(scanf("%d%d",&n,&m)!=EOF&&(m||n))

{

for(i=0;i<n;i++)

for(j=0;j<m;j++)

{

scanf("%d",&map[i][j]);

visited[i][j]=4;

}

scanf("%d",&k);

while(k--)

{

for(i=0;i<n;i++)

for(j=0;j<m;j++) visited[i][j]=4;

start.c=-1; start.f=-1;

scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);

start.x-=1;start.y-=1;end.x-=1;end.y-=1;

if(map[start.x][start.y]!=map[end.x][end.y]) {cout<<"NO"<<endl; continue; }

if(map[start.x][start.y]==0) { cout<<"NO"<<endl; continue; }

if(BFS(start))

{

cout<<"YES"<<endl;

continue;

}

cout<<"NO"<<endl;

}

}

return 0;

}

http://acm.hdu.edu.cn/showproblem.php?pid=1175

题意:找到两个相同的数字 拐弯个数不能超过2 还有一些限制条件在这里就不在赘述了

思路: 开始我用DFS 结果超时 下次想问题时一定要确定用什么方法去解决问题 总体方针没有正确后面再好也会错

       用BFS找 过程中要注意用visited[][]标记每个点的拐弯数 如果遍历到它时 本身拐弯数小于等于该点的 则可以遍历该

       点;其他方法都比较基本不在赘述 

下一篇: hdu-4281