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;
}
浙公网安备 33010602011771号