单挑女飞贼
实际上这是一道水题
本弱菜由于看错题WA了好多次orzzzz……
思路
按照最普通的思路
从林月如的位置进行宽搜
每次取出头结点判断飞镖是否可以攻击到女飞贼
没有用STL队列所以代码很丑
还有就是数据很弱 这样做居然可以秒掉……
代码
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int Maxn=301;
struct node {int x,y,step;}point[20000];
char c;
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,1,-1};
int n,m,x1,x2,y1,y2;
bool map[Maxn][Maxn],vis[Maxn][Maxn];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>c;
if(c=='O')map[i][j]=0;
if(c=='X')map[i][j]=1;
}
while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF && x1 && x2 && y1 && y2 ){
memset(point,0,sizeof(point));
memset(vis,0,sizeof(vis));
int head=1,tail=1;
point[head].x=x2;
point[head].y=y2;
point[head].step=0;
bool judge=1;
while(head<=tail){
int nx=point[head].x;
int ny=point[head].y;
if(nx==x1){
int l=min(ny,y1),r=max(ny,y1),pd=1;
for(int j=l+1;j<r;j++)if(map[nx][j]==1){pd=0;break;}
if(pd==1){printf("%d\n",point[head].step);judge=0;}
}
if(judge==0)break;
if(ny==y1){
int l=min(nx,x1),r=max(nx,x1),pd=1;
for(int j=l+1;j<r;j++)if(map[j][ny]==1){pd=0;break;}
if(pd==1){printf("%d\n",point[head].step);judge=0;}
}
if(judge==0)break;
if(nx-ny==x1-y1){
int p=min(nx,x1),q=min(ny,y1),pd=1;
int mx=max(nx,x1),my=max(ny,y1);
while(p<mx&&q<my){
if(map[p][q]==1){pd=0;break;}
p++;q++;
}
if(pd==1){printf("%d\n",point[head].step);judge=0;}
}
if(judge==0)break;
if(nx+ny==x1+y1){
int p=min(nx,x1),q=max(ny,y1),pd=1;
int mx=max(nx,x1),my=min(ny,y1);
while(p<mx&&q>my){
if(map[p][q]==1){pd=0;break;}
p++;q--;
}
if(pd==1){printf("%d\n",point[head].step);judge=0;}
}
if(judge==0)break;
for(int i=1;i<=4;i++){
int xx=nx+dx[i];
int yy=ny+dy[i];
if(xx>=1&&yy>=1&&xx<=n&&yy<=m&&!map[xx][yy]&&!vis[xx][yy]){
tail++;
point[tail].x=xx;
point[tail].y=yy;
point[tail].step=point[head].step+1;
vis[xx][yy]=1;
}
}
head++;
}
if(judge==1)printf("Impossible!\n");
}
}
欢迎指出Bug
End。