题解 P6194苏联人
Posted win10crz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P6194苏联人相关的知识,希望对你有一定的参考价值。
这就是一道纯模拟题,并且棋盘大小规定了为 (8 imes 8),数据小,还不用担心超时。
我的大体思路就是:先用一个字符数组读入棋盘,然后进行扫描。用一个布尔数组记录当前位置能否被其他棋子攻击到,初始值为 false,当扫描过程中扫描到的字符为 B
或 R
,就按照规则(战场为将布尔数组的值改变。
但有个坑点,主教和战车不能越过棋子,那么在当前位置有棋子后就停止赋值。
具体思路结合代码注释食用更佳。
#include<bits/stdc++.h>
using namespace std;
#define rg register
char a[10][10];
bool mp[10][10];
int main()
{
for(rg int i=1;i<=8;i++)
{
for(rg int j=1;j<=8;j++)
{
a[i][j]=getchar(); //getchar 更快!
}
getchar(); //注意处理换行符。
}
for(rg int i=1;i<=8;i++) //扫描
{
for(rg int j=1;j<=8;j++)
{
if(a[i][j]==‘R‘) //如果是战车。
{
mp[i][j]=1; //首先当前的位置肯定不能放了。
for(int k=1;i+k<=8&&a[i+k][j]==‘.‘;k++) //四个循环就是东南西北方向(雾
mp[i+k][j]=1; //并且要判断有没有棋子挡道。
for(int k=1;i+k>=1&&a[i-k][j]==‘.‘;k++)
mp[i-k][j]=1;
for(int k=1;j+k<=8&&a[i][j+k]==‘.‘;k++)
mp[i][j+k]=1;
for(int k=1;j-k>=1&&a[i][j-k]==‘.‘;k++)
mp[i][j-k]=1;
}
if(a[i][j]==‘B‘) //如果是主教。
{
mp[i][j]=1; //同理。
for(int k=1;i+k<=8&&j+k<=8&&a[i+k][j+k]==‘.‘;k++) //对应四个斜的方向。
mp[i+k][j+k]=1;
for(int k=1;i-k>=1&&j-k>=1&&a[i-k][j-k]==‘.‘;k++)
mp[i-k][j-k]=1;
for(int k=1;i+k<=8&&j-k>=1&&a[i+k][j-k]==‘.‘;k++)
mp[i+k][j-k]=1;
for(int k=1;i-k>=1&&j+k<=8&&a[i-k][j+k]==‘.‘;k++)
mp[i-k][j+k]=1;
}
}
}
for(rg int i=1;i<=8;i++) //输出。
{
for(rg int j=1;j<=8;j++)
{
if(mp[i][j]==0) //没有棋子能攻击到。
putchar(‘1‘); //输出 1,不用 cout还是因为 putchar 更快。
else
putchar(‘0‘);
}
putchar(‘
‘);
}
return 0;
}
以上是关于题解 P6194苏联人的主要内容,如果未能解决你的问题,请参考以下文章