zju 2411 Link Link Look(BFS)

和hdu1175 ( 连连看 ) 差不多,不过这题可以在边边连 

#include <stdio.h>
#include <string.h>
#include <queue>

using namespace std;

#define MAXSIZE 105

struct QNode
{
    int x,y,d,turns;
};
queue<QNode> que;

const int dir[4][2]= {{-1,0},{0,1},{1,0},{0,-1}};
int N,M,grid[MAXSIZE][MAXSIZE],turn[MAXSIZE][MAXSIZE];

bool bfs(int sx,int sy,int ex,int ey)
{
    while(!que.empty()) que.pop();
    QNode in,out;
    in.x=sx;
    in.y=sy;
    in.turns=0;
    int k;
    for(k=0; k<4; k++)
    {
        in.d=k;
        que.push(in);
    }
    while(!que.empty())
    {
        out=que.front();
        que.pop();
        if(out.x==ex && out.y==ey && turn[ex][ey]<=2) return true;
        for(int k=0; k<4; k++)
        {
            in.x=out.x+dir[k][0];
            in.y=out.y+dir[k][1];
            in.d=k;
            in.turns=out.turns;
            if(out.d!=k) in.turns++;
            if(in.turns>2) continue;
            if( in.x<0 || in.y<0 || in.x > N+1 || in.y > M+1 ) continue;//可以在边连
            if(!grid[in.x][in.y] || (in.x==ex && in.y==ey) )
            {
                if( turn[in.x][in.y] == -1 || turn[in.x][in.y]>=in.turns )
                {
                    turn[in.x][in.y] = in.turns;
                    que.push(in);
                }
            }
        }
    }
    return false;
}

int main()
{
    #ifndef ONLINE_JUDGE
    freopen("testdata.txt","r",stdin);
    #endif
    int i,j,T,sx,sy,ex,ey;
    while(scanf("%d %d",&N,&M),N+M)
    {
        memset(grid,0,sizeof(grid));
        for(i=1; i<=N; i++)
        {
            for(j=1; j<=M; j++)
            {
                scanf("%d",&grid[i][j]);
            }
        }
        scanf("%d",&T);
        int cnt=0;
        while(T--)
        {
            scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
            int &x=grid[sx][sy],&y=grid[ex][ey];
            if(x!=y || !x || !y || (sx==ex && sy==ey)) continue;
            memset(turn,-1,sizeof(turn));
            turn[sx][sy]=0;
            if(bfs(sx,sy,ex,ey))
            {
                cnt+=2;
                x=y=0;
            }
        }
        printf("%d\n",cnt);
    }
    return 0;
}

 

posted @ 2010-08-31 16:16  菜到不得鸟  阅读(176)  评论(0)    收藏  举报