题目解析
使用二维数组 grid[N][N] 来表示棋盘上的棋子,把棋盘上所有除了国王以外的棋子标记为 111。
使用二维数组 state[N][N] 来表示棋盘上各个位置上是否可以被攻击到,可以攻击到的位置标记为 111。
实现以下功能:
1. int f(char ch): 将棋子的坐标转化为容易处理的整数。
2. int check(int x, int y):检测 (x,y)(x, y)(x,y) 是否越界。
3. move(int x, int y, int dx, int dy):表示以坐标 (x,y)(x, y)(x,y) 为起点,坐标 Δ\DeltaΔ 为 [dx,dy][dx, dy][dx,dy] 移动并将 state[x+dx×c][y+dy×c],(c∈Z)state[x + dx \times c][y + dy \times c], (c \in{\mathbb{Z}})state[x+dx×c][y+dy×c],(c∈Z) 标记为 111。
4. queen(x, y):将位置在 (x,y)(x, y)(x,y) 上的皇后可以走到的位置标记为 111。
5. pawn(x, y):将位置在 (x,y)(x, y)(x,y) 上的兵可以走到的位置标记为 111。
6. rook(x, y):将位置在 (x,y)(x, y)(x,y) 上的车可以走到的位置标记为 111。
7. bishop(x, y):将位置在 (x,y)(x, y)(x,y) 上的主教可以走到的位置标记为 111。
8. knight(x, y):将位置在 (x,y)(x, y)(x,y) 上的骑士可以走到的位置标记为 111。
若国王的位置为(x,y)(x, y)(x,y),且被将军则 state[x][y]=1state[x][y] = 1state[x][y]=1,否则 state[x][y]=0state[x][y] = 0state[x][y]=0。
检测国王周围的最多可以走到的 888 个位置 (x′,y′)(x', y')(x′,y′) 若存在 state[x′][y′]=0state[x'][y'] = 0state[x′][y′]=0 则国王可以可以走到一个不会被将军的新格子中。
按照题意检测上述两个条件即可得到棋盘的状态。
AC代码
复杂度分析
令棋盘的长度为 MMM。
则将每个棋子可以攻击到的位置标记的时间复杂度为 O(M2)O(M^2)O(M2)。
总的时间复杂度为 O(NM2)O(NM^2)O(NM2)。