HDU 1175(搜索DFS)

来源:互联网 发布:python格式化毫秒数 编辑:程序博客网 时间:2024/05/09 13:18
#include <stdio.h>#include <string.h>#include <iostream>using namespace std;int ss[1005][1005];int vis[1005][1005];int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};int x1, y1, x2, y2, n, m;int fi;int isin(int x, int y){    return x >= 1 && x <= n && y >= 1 && y <= m;}int dfs(int x, int y, int cnt, int di){    if(fi) return 1;    vis[x][y] = 1;    if(cnt > 2) return 0;    if(cnt == 2 && x - x2 != 0 && y - y2 != 0)    //最重要的剪枝        return 0;    for(int i  = 0; i < 4; i++)    {        int ans;        int tempx = x + dir[i][0];        int tempy = y + dir[i][1];        if( i == di)            ans = cnt;        else            ans  = cnt + 1;        if(!isin(tempx, tempy) || vis[tempx][tempy]) continue;        if(tempx == x2 && tempy == y2 && ans <= 2)        {            fi = 1;            return 1;        }        if(!ss[tempx][tempy]){            if(di == 5) ans = 0;            if(dfs(tempx, tempy, ans, i))                return 1;            else                vis[tempx][tempy] = 0;        }    }    return 0;}int main(){    while(cin>>n>>m)    {        if(!n && !m) break;        for(int i = 1; i <= n; i++)            for(int j = 1; j <= m; j++)                scanf("%d", &ss[i][j]);        int q;        cin>>q;        for(int i = 0; i < q; i++)        {            fi = 0;            memset(vis, 0, sizeof vis);            cin>>x1>>y1>>x2>>y2;            if(ss[x1][y1] == 0 || ss[x2][y2] == 0){                cout<<"NO"<<endl;                continue;            }            else if(ss[x1][y1] != ss[x2][y2]){                cout<<"NO"<<endl;                continue;            }            else {                if(dfs(x1, y1, 0, 5))                    cout<<"YES"<<endl;                else                    cout<<"NO"<<endl;            }        }    }    return 0;}

0 0