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