http://acm.hdu.edu.cn/showproblem.php?pid=2531
题意:橄榄球诶、、、超喜欢四分卫的说。好吧,题目其实很简单,BFS搜索,不过一开始没看懂吗,为什么有多个D和Q,蛋疼过后才发现那是球员的身体的一部分。ORZ
嗯,我是把防守队员的身体保存在一个结构体里面,每次判断是否身体会触碰O即可。
/*
* Danceonly
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
#define MAX(a,b) (a > b ? a : b)
#define MIN(a,b) (a < b ? a : b)
struct node
{
int x;
int y;
}body[30];
struct abc
{
int x,y;
int step;
}q[100005],e;
int maze[105][105],vis[105][105];
int dir[4][2] = {1,0,0,1,-1,0,0,-1};
int N,M,L,sx,sy;
bool Isok(int x,int y)
{
for (int i=0;i<L;i++)
{
int xx = x + body[i].x;
int yy = y + body[i].y;
if (maze[xx][yy] == 0)return 0;
}
return 1;
}
void gogo(int x,int y)
{
for (int i=0;i<L;i++)
{
body[i].x += x;
body[i].y += y;
}
return ;
}
bool Isend(int x,int y)
{
for (int i=0;i<L;i++)
{
if (maze[body[i].x + x][body[i].y + y] == 2)return 1;
}
return 0;
}
int BFS()
{
int tail,head,x,y,step;
tail = head = 0;
q[head].x = sx;
q[head].y = sy;
q[head].step = 0;
vis[sx][sy] = 1;
while (head <= tail)
{
x = q[head].x;
y = q[head].y;
step = q[head].step;
for (int i=0;i<4;i++)
{
e.x = x + dir[i][0];
e.y = y + dir[i][1];
if (vis[e.x][e.y] || Isok(e.x-sx,e.y-sy) == 0)continue ;
//gogo(e.x-sx,e.y-sy);
e.step = step + 1;
if (Isend(e.x-sx,e.y-sy))
{
return e.step;
}
vis[e.x][e.y] = 1;
q[++tail] = e;
}
head ++;
}
return -1;
}
void show()
{
for (int i=1;i<=N;i++)
{
for (int j=1;j<=M;j++)
printf("%d ",maze[i][j]);
printf("\n");
}
}
int main()
{
while (scanf("%d%d",&N,&M) == 2 && (N || M))
{
memset(vis,0,sizeof(vis));
memset(maze,0,sizeof(maze));
int c = 0;
for (int i=1;i<=N;i++)
{
char ss[105];
scanf("%s",ss);
for (int j=0;j<M;j++)
if (ss[j] == '.')maze[i][j+1] = 1;//could go
else if (ss[j] == 'D'){maze[i][j+1] = 1;body[c].x = i;body[c++].y = j+1;}
else if (ss[j] == 'Q')maze[i][j+1] = 2;//It is the end.
}
//show();
sx = body[0].x;sy = body[0].y;
L = c;
//printf("%d\n",L);
int ans = BFS();
if (ans == -1)printf("Impossible\n");
else printf("%d\n",ans);
}
return 0;
}
/*
6 6
.Q....
QQ..OO
.OO..O
...O.O
OO.O..
....DD
*/