题解 P6194【苏联人】

这就是一道纯模拟题,并且棋盘大小规定了为 (8 imes 8),数据小,还不用担心超时。

我的大体思路就是:先用一个字符数组读入棋盘,然后进行扫描。用一个布尔数组记录当前位置能否被其他棋子攻击到,初始值为 false,当扫描过程中扫描到的字符为 BR,就按照规则(战场为将布尔数组的值改变。

但有个坑点,主教和战车不能越过棋子,那么在当前位置有棋子后就停止赋值。

具体思路结合代码注释食用更佳。

#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;
} 
原文地址:https://www.cnblogs.com/win10crz/p/12859789.html