hdu 1175连连看 (bfs带方向变化次数)

//用结构体进行广搜,便于记录方向变化次数
#include<iostream>
#include<queue>
using namespace std;

const int maxn = 1000 + 10;
const int INF = 0x3fffffff;
int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};
int map[maxn][maxn];
int n, m;
int v[maxn][maxn];

typedef struct{
int x;
int y;
int d; //方向
int c; //次数
}node;
node Start, End;

void init(){
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
v[i][j] = INF;
}
}
}

void bfs(){
queue<node>q;
node cur, pre;
Start.d = -1;
Start.c = 0;
q.push(Start);
while(!q.empty()){
pre = q.front ();
q.pop ();
if(pre.x == End.x && pre.y == End.y){
cout<<"YES"<<endl;
return ;
}
for(int i=0; i<4; i++){
cur.x = pre.x + dir[i][0];
cur.y = pre.y + dir[i][1];
cur.c = pre.c;
cur.d = i;
if(pre.d != cur.d && pre.d != -1){
cur.c++;
}
if(cur.x < 1 || cur.y <1 || cur.x >n || cur.y > m || cur.c > 2){
continue;
}
if(map[cur.x][cur.y] && !(cur.x == End.x && cur.y == End.y)){ //有阻碍
continue;
}
if(cur.c<v[cur.x][cur.y]){ //新的转折次数小于以前访问时的转折次数那么更新,否则就不更新。
v[cur.x][cur.y] = cur.c;
q.push(cur);
}
}
}
cout<<"NO"<<endl;
}

int main(){
while(cin>>n>>m){
if(!(n && m))
break;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
cin>>map[i][j];
}
}
int t;
cin>>t;
while(t--){
cin>>Start.x>>Start.y>>End.x>>End.y;
if(!map[Start.x][Start.y] || !map[End.x][End.y] || (map[Start.x][Start.y] != map[End.x][End.y])){
cout<<"NO"<<endl;
continue;
}
init();
bfs();
}
}
return 0;
}

原文地址:https://www.cnblogs.com/cbyniypeu/p/3519822.html