这题为什么叫苏联人啊~是一道典型的模拟题目。
直接模拟每一个战车与主教所能到达的地方,即可判断出国王能够放置在哪里。
战车
1 | void castle(int x, int y) { // (x,y)表示战车的坐标 |
这段代码的意义为,模拟战车珂以行动到的地方。其中第一段代码是模拟战车往上的攻击方式。如果$(x_1,y_1)$能够被$(x,y)$向上行驶攻击到,那么说明:
$y_1=y$
$x<x_1$
$\forall x_1<i<x$,$board[i][y]$没有棋子。
所以,从 $i=x-1$ 开始,每次 $i$ 减去 $1$,如果遇到了其他的棋子,那么就停止循环,并把每一个遍历过的棋盘格子全部打上标记,表示这个格子不能放国王。向下、向左、向右的操作与向上同理。
主教
1 | void bishop(int x, int y) { |
左上:对于格子 $(x,y)$ 左上角的格子,必然为 $(x-i,y-i)$ 的形式,那么便要求 $x-i\geq 0, y-i\ge 0$。所以$i\leq x,i\le y$。所以 $i \le \min(x,y)$。所以 $i$ 从 $1$ 开始遍历到 $\min(x,y)$,每次研究的格子便是 $(x-i,y-i)$。如果这个格子已经又棋子,那么就结束循环。否则就打上不能放置的标记。右上、右下、左下同理。
主程序
1 |
|
首先输入棋盘,使用数字存储。如果是战车,那么设为 $1$,如果是空地,那么设为 $0$,如果是主教,那么设为 $2$。
接着遍历整个棋盘打标记,最后输出即可。