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

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

#include
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;
}

你可能感兴趣的:(模拟题(逻辑思维))