恢复训练复习——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];
}

 

posted @ 2021-09-01 17:55  DNULL  阅读(75)  评论(0)    收藏  举报