【t074】上学路线

Time Limit: 1 second
Memory Limit: 128 MB

【问题描述】

你所在城市的街道好像一个棋盘,有a条南北方向的街道,和b条东西方向的街道。
南北方向的a条街道从西到东依次编号为1到a,而东西方向的b条街道从南到北依次编号为1到b,南北方向的街道i和东西方向的街道
j的交点记为(I,j)。
你住在(1,1)处,而学校在(a,b)处,你骑自行车去上学,自行车只能沿着街道走,而且为了缩短时间只允许沿着向东和北的方向行
驶。
现在有N个交叉路口在施工(X1,Y1)、(X2,Y2),,,(Xn,Yn),这些路口是不能通车的。
问你上学一共有多少走法?
这里写图片描述

【输入格式】

第一行包含两个整数a和b,并且满足1<=a,b<=16。
第二行包含一个整数N,表示有N个路口在维修(1<=N<=40)
接下来N行,每行两个整数X_i,Y_i,描述路口的位置。

【输出格式】

输出一个整数表示从(1,1)到(a,b)的行车路线总数。

Sample Input

5 4
3
2 2
2 3
4 2

Sample Output

5

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=t074

【题解】

递推公式f[i][j] = f[i-1][j]+f[i][j-1];
边界搞一搞就好;

【完整代码】

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <set>
#include <map>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <string>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

void rel(LL &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t) && t!='-') t = getchar();
    LL sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

void rei(int &r)
{
    r = 0;
    char t = getchar();
    while (!isdigit(t)&&t!='-') t = getchar();
    int sign = 1;
    if (t == '-')sign = -1;
    while (!isdigit(t)) t = getchar();
    while (isdigit(t)) r = r * 10 + t - '0', t = getchar();
    r = r*sign;
}

const int MAXN = 16+5;
const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);

int a,b,n;
bool bo[MAXN][MAXN];
LL ans[MAXN][MAXN];

int main()
{
    //freopen("F:\rush.txt","r",stdin);
    memset(bo,true,sizeof(bo));
    scanf("%d%d",&a,&b);
    swap(a,b);
    scanf("%d",&n);
    rep1(i,1,n)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        swap(x,y);
        bo[x][y] = false;
    }
    rep1(i,1,a)
    {
        if (!bo[i][1]) break;
        ans[i][1] = 1;
    }
    rep1(i,1,b)
    {
        if (!bo[1][i]) break;
        ans[1][i] = 1;
    }
    rep1(i,2,a)
        rep1(j,2,b)
            if (bo[i][j])
                ans[i][j] = ans[i-1][j]+ans[i][j-1];
    cout << ans[a][b]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626891.html