【NOIP2002】【codevs1010】过河卒

problem

solution

codes

//填表法
#include<iostream>
using namespace std;
int n, m, x, y, a[20][20], f[20][20];
int main(){
    cin>>n>>m>>x>>y; x++;y++;n++;m++;//+1方便赋初始值
    //9 points could'n be find
    a[x][y] = 1;
    a[x-1][y-2] = a[x-1][y+2] = a[x+1][y-2] = a[x+1][y+2] = 1;
    a[x-2][y-1] = a[x-2][y+1] = a[x+2][y-1] = a[x+2][y+1] = 1;
    f[0][1] = 1; //边界
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            if(!a[i][j])f[i][j] = f[i-1][j]+f[i][j-1];
    cout<<f[n][m]<<"\n";
    return 0;
}
//刷表法
#include<iostream>
using namespace std;
int n, m, x, y, a[20][20], f[20][20];
int main(){
    cin>>n>>m>>x>>y;
    a[x][y] = 1;
    a[x-1][y-2] = a[x-1][y+2] = a[x+1][y-2] = a[x+1][y+2] = 1;
    a[x-2][y-1] = a[x-2][y+1] = a[x+2][y-1] = a[x+2][y+1] = 1;
    f[0][0] = 1;//初始值, 刷表时不会覆盖所以可以直接放
    for(int i = 0; i <= n; i++){
        for(int j = 0; j <= m; j++){
            if(!a[i+1][j])f[i+1][j] += f[i][j];
            if(!a[i][j+1])f[i][j+1] += f[i][j];
        }
    }
    cout<<f[n][m]<<"\n";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_33957603/article/details/80502432
今日推荐