您的位置:首页 > 其它

hdu 1175 连连看

2013-07-18 14:57 246 查看
链接:点击打开链接

用一个数记上一步的方向,然后与当前方向比较,不同则转弯啦,count++,相同不变。两个棋子之间的连线不能有其他棋子,而且起点终点相同,也不能消,起点,终点,没有棋子,也是NO。

还有一种是和hdu 1728 逃离迷宫一样的思路,哎,水,自己应该是判断条件错啦,华丽丽的WA啦。又找不出哪里错啦。真心是一个思路。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define INF 0x3f3f3f
struct node{
int x;
int y;
int count;
int z;
};
int n,m,x1,y1,x2,y2,a[4][2]={-1,0,1,0,0,1,0,-1};
int str[1100][1100];
int vis[1100][1100];
int bfs(){
int i;
if((x1==x2&&y1==y2)||!str[x1][y1]||!str[x2][y2]||str[x1][y1]!=str[x2][y2])
return 0;
queue<node>Q;
node p,q;
memset(vis,INF,sizeof(vis));
p.x=x1;
p.y=y1;
p.z=-1;
p.count=0;
vis[p.x][p.y]=0;
for(i=0;i<4;i++){
q=p;
q.x=p.x+a[i][0];
q.y=p.y+a[i][1];
if(q.x>0&&q.x<=n&&q.y>0&&q.y<=m&&q.count<=2){
if(q.x==x2&&q.y==y2)
return 1;
q.z=i;
if(!str[q.x][q.y]){
vis[q.x][q.y]=0;
Q.push(q);
}
}
}
while(!Q.empty()){
p=Q.front();
Q.pop();
for(i=0;i<4;i++){
q=p;
q.x=p.x+a[i][0];
q.y=p.y+a[i][1];
q.z=i;
if(p.z!=q.z)
q.count++;
if(q.x>0&&q.x<=n&&q.y>0&&q.y<=m&&q.count<=2&&q.count<=vis[q.x][q.y]){
if(q.x==x2&&q.y==y2)
return 1;
if(!str[q.x][q.y]){
vis[q.x][q.y]=q.count;
Q.push(q);
}
}
}
}
return 0;
}
int main(){
int i,j,q;
while(~scanf("%d %d",&n,&m)){
if(n==0&&m==0)
break;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&str[i][j]);
scanf("%d",&q);
for(i=0;i<q;i++){
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
if(bfs())
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: