vijos P1263 单挑女飞贼

单挑女飞贼

实际上这是一道水题

本弱菜由于看错题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。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值