题意:国际象棋的规则,给你n*n的棋盘,并且给你一个(x,y)的坐标,问你在这个位置上放战车等棋子分别能攻击到几个格子。
思路:降智打击,骑士和国王都是八连通(骑士只是另一种八连通),只要周围跑一圈判断有没有出界就ok,主教左上右上等四个边界减自身坐标取xy最小值就是能攻击到的格子,战车就不用说了(n-1)*2,皇后就是主教加战车。
using namespace std;
const int dx[]={1,1,1,-1,-1,-1,0,0},dy[]={1,-1,0,1,-1,0,1,-1};
const int kx[]={1,1,2,2,-1,-1,-2,-2},ky[]={2,-2,1,-1,2,-2,1,-1};
int n;
bool check(int x,int y)
{
return (x>=1 && x<=n && y>=1 && y<=n);
}
int x,y;
int main()
{
cin>>n>>x>>y;
int ans1=8,ans2=8;
for(int i=0;i<8;i++)
{
int xx=dx[i]+x,yy=dy[i]+y;
int xxx=kx[i]+x,yyy=ky[i]+y;
if(!check(xx,yy))
ans1--;
if(!check(xxx,yyy))
ans2--;
}
cout<<"King: "<<ans1<<endl;
cout<<"Knight: "<<ans2<<endl;
ans1=min(x-1,y-1)+min(x-1,n-y)+min(n-x,y-1)+min(n-x,n-y);
ans2=n*2-2;
cout<<"Bishop: "<<ans1<<endl;
cout<<"Rook: "<<ans2<<endl;
cout<<"Queen: "<<ans1+ans2<<endl;
return 0;
}