hdu1175连连看(BFS)

2014-11-24 02:37:36 · 作者: · 浏览: 1
BFS和DFS都可以解决这道题目
#include  
#include  
#include  
#include  
#define MAXN 1005  
using namespace std;  
int map[MAXN][MAXN],v[MAXN][MAXN];  
const int dx[4] = {0,1,0,-1};  
const int dy[4] = {-1,0,1,0};  
int n,m,flag;  
struct node  
{  
    int x,y;  
    int dir;//记录方向  
    int step;//记录转弯次数  
};  
int bfs(int x1,int y1,int x2,int y2)  
{  
    memset(v,1,sizeof(v));  
    queue  q;  
    node s,temp;  
    s.x = x1;  
    s.y = y1;  
    s.dir = -1;//-1表示朝哪个方向都可以  
    s.step = 0;  
    q.push(s);  
    while(!q.empty())  
    {  
        temp = q.front();  
        q.pop();  
        if(temp.x == x2 && temp.y == y2 && temp.step <= 2)  
            return 1;  
        for(int i = 0; i < 4; i ++)  
        {  
            s = temp;  
            s.x += dx[i];  
            s.y += dy[i];  
            if(s.x >= 1 && s.x <= n && s.y >= 1 && s.y <= m && (map[s.x][s.y] == 0 || (s.x == x2 && s.y == y2)))  
            {  
                if(s.dir != -1)  
                {  
                    if(s.dir != i)  
                    {  
                        s.dir = i;  
                        s.step ++;  
                    }  
                }  
                else s.dir = i;  
                if(s.step >
2) continue; if(s.step <= v[s.x][s.y])//保证转弯次数最少,等号不能忘记 { v[s.x][s.y] = s.step; q.push(s); } } } } return 0; } int main() { int i,j,t,x1,y1,x2,y2; while(scanf("%d%d",&n,&m),(n+m)) { for(i = 1; i <= n; i ++) for(j = 1; j <= m; j ++) scanf("%d",&map[i][j]); scanf("%d",&t); while(t--) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(!map[x1][y1] || !map[x2][y2] || map[x1][y1] != map[x2][y2] || (x1 == x2 && y1 == y2) ) flag = 0; else flag = bfs(x1,y1,x2,y2); if(flag) puts("YES"); else puts("NO"); } } return 0; }