Chinaunix首页 | 论坛 | 博客
  • 博客访问: 198196
  • 博文数量: 67
  • 博客积分: 2970
  • 博客等级: 少校
  • 技术积分: 685
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-23 11:36
文章分类

全部博文(67)

文章存档

2012年(2)

2011年(19)

2010年(46)

我的朋友

分类: C/C++

2010-07-25 12:16:17

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

const int dir[][2]={{0,1},{1,0},{-1,0},{0,-1}};
const int Maxn=1001;

struct point
{
    int x,y;
    int num;        //记录偏转次数

    int from;        //记录访问该点的方向

    point(){}
};

int g[Maxn][Maxn];
bool visit[Maxn][Maxn];
bool exist;

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m),n)
    {
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                scanf("%d",g[i]+j);

        int cases;
        scanf("%d",&cases);
        while(cases--)
        {
            point start,end;
            scanf("%d%d%d%d",&start.x,&start.y,&end.x,&end.y);
            start.x--;start.y--;
            end.x--;end.y--;

            exist=false;
            if(g[start.x][start.y]==g[end.x][end.y]&&g[start.x][start.y]!=0)
            {
                for(int i=0;i<n;i++)
                    for(int j=0;j<m;j++)
                        visit[i][j]=0;

                start.from=-1;

                queue<point> que;
                que.push(start);
                while(!que.empty())
                {
                    point temp=que.front();
                    que.pop();
                    if(temp.x==end.x&&temp.y==end.y)
                    {
                        exist=true;
                        break;
                    }

                    for(int i=0;i<4;i++)
                    {
                        point cur;
                        cur.x=temp.x+dir[i][0];
                        cur.y=temp.y+dir[i][1];
                        if(cur.x<0||cur.x>=n||cur.y<0||cur.y>=m)
                            continue;
                        if(visit[cur.x][cur.y])
                            continue;
                        if(g[cur.x][cur.y]!=0&&!(cur.x==end.x&&cur.y==end.y))
                            continue;
                        //过滤出g[i][j]=0或end点

                        
                        if(i==temp.from)
                        {
                            cur.num=temp.num;
                            cur.from=i;
                            visit[cur.x][cur.y]=1;
                            que.push(cur);
                        }
                        else
                        {
                            if(temp.from==-1)
                            {
                                cur.num=1;
                                cur.from=i;
                                visit[cur.x][cur.y]=1;
                                que.push(cur);
                                
                            }
                            else if(temp.num<3)
                            {
                                cur.num=temp.num+1;
                                cur.from=i;
                                visit[cur.x][cur.y]=1;
                                que.push(cur);
                            }
                        }
                    }
                }
            }
            if(exist)
                printf("YES\n");
            else
                printf("NO\n");
        }
    }
    return 0;
}


阅读(1124) | 评论(0) | 转发(0) |
0

上一篇:整数的因子分解

下一篇:图着色

给主人留下些什么吧!~~