Fall 2019 ICPC-style Waterloo Local Contest:C:Pawn's Revenge(枚举)

在这里插入图片描述
这道题首先搞懂题意:题目问是否你能够放一种棋子使得全部在攻击范围内,并且有两种棋子:
1.第一种棋子是pawn是卒,他能攻击左上角+右上角;
2.第二种是K棋子,他能攻击相邻的8个方向,题目中只给了一个K棋子,并且是已经下好了的,其实知道国际象棋的就应该知道这个常识,如果K都没有了,那么还下什么棋呢?
题目问:最少放多少个p棋子能使得星号都在攻击范围上;
其实每个挨着枚举一遍就行,所有出现的情况就是这几种
在这里插入图片描述
枚举每个格子,并且同时判断他的左下角或者右下角是不是-,然后去放一个p
最后扫一遍n
n看看还有没有是*但是还没有被标记的点,如果还有,那么肯定不可能包围完;
AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
char s[1050][1050];
int book[1050][1050];//标记
int main(){
	scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%s",s[i]);
  for(int i=0;i<n;i++){
  	  for(int j=0;j<n;j++){
  	  	   if(s[i][j]=='K'){//找K的位置
  	  	   	       for(int x=-1;x<=1;x++){
  	  	   	       	   for(int y=-1;y<=1;y++){
  	  	   	       	   	   int nx=i+x,ny=j+y;
  	  	   	       	   	      if(nx>=0&&nx<n&&ny>=0&&ny<n&&s[nx][ny]=='*'){
  	  	   	       	   	      	       book[nx][ny]=1;
										   }
								 }
						  }
			   }
		}
  }
  int ans=0;
  for(int i=0;i<n;i++){
  	  for(int j=0;j<n;j++){
  	  	    if(s[i][j]=='*'&&!book[i][j]){
  	  	    	   if(i+1<n&&j+1<n&&s[i+1][j+1]=='-'){//如果没有越界并且   右下角为-
  	  	    	   	      s[i+1][j+1]='p';
  	  	    	   	      book[i][j]=1;
  	  	    	   	      if(j+2<n)book[i][j+2]=1;///后面的第二个没有越界,不管有没有*都把他标记,表示在攻击范围内
  	  	    	   	      ans++;
					   }else if(i+1<n&&j-1>=0&&s[i+1][j-1]=='-'){
					   	  s[i+1][j-1]='p';
					   	  book[i][j]=1;
					   	  ans++;
					   }
				}
		}
  }
  for(int i=0;i<n;i++){///找一遍  还有没有不在攻击范围内的
  	  for(int j=0;j<n;j++){
  	  	   if(s[i][j]=='*'&&!book[i][j]){
  	  	   	   puts("-1");
  	  	   	   return 0;
			   }
		}
  }
  printf("%d\n",ans);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值