URAL 2010. Sasha the Young Grandmaster题解

传送门


题意:国际象棋的规则,给你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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值