恢复训练复习——luogu1002
luoguP1002
1.在矩阵中进行操作时,若超出矩阵,可以扩展矩阵的边界,以避免逐个判定是否超出矩阵
对于题目中被马所封死的格子,若是坐标小于0,则用二维数组表示会报错,可以将所有横纵坐标+2,为可能封死的格子留出位置
2.在枚举上下左右移动的可能性时,可以将方向储存为一个数组,通过循环来枚举每种方向,而不用每个方向都编写
对于题目中马的不同移动方向可以用两个数组来表示横纵方向,从而通过一个循环标记封锁的格子
3.注意在用二维数组时对应的横纵坐标,一位下标为行,二位下标为列
代码如下
#include<cstdio> #include<iostream> #include<cstring> #include<iomanip> using namespace std; int ha[9] = { 0,2,2,1,1,-1,-1,-2,-2 }; int hb[9] = { 0,1,-1,2,-2,2,-2,1,-1 }; long long p[300][300]; int x, y, a, b; void init() { cin >> y >> x >> b >> a; x += 2; y += 2; a += 2; b += 2; p[b][a] = -1; for (int i = 1; i <= 8; i++) { p[b + hb[i]][a + ha[i]] = -1; } p[0 + 2][0 + 2] = 1; for (int i = 1; i <= y ; i++) { for (int j = 1; j <= x ; j++) { if (p[i][j] != -1) { if (p[i - 1][j] != -1) p[i][j] += p[i - 1][j]; if (p[i][j - 1] != -1) p[i][j] += p[i][j - 1]; } } } } int main() { init(); cout << p[y][x]; }

浙公网安备 33010602011771号