1. 程式人生 > >codevs——2693 上學路線(施工)

codevs——2693 上學路線(施工)

輸出 ima ext amp code left main wrapper ret

2693 上學路線(施工)

時間限制: 2 s 空間限制: 16000 KB 題目等級 : 黃金 Gold 題目描述 Description

問題描述

你所在的城市街道好像一個棋盤,有a條南北方向的街道和b條東西方向的街道。

南北方向a條街道從西到東依次編號為1到a,而東西方向的b條街道從南到北依次編號為1到b,南北方向的街道i和東西方向的街道j的交點記為(i,j)。

假定你住在(1,1)處,而學校在(a,b)處,你騎自行車去上學,自行車只能沿著街道走,而且為了縮短時間只允許沿著東、北方向行駛。

現在有n個交叉路口在施工(X1,Y1),(X2,Y2),(Xn,Yn),這些路口暫時不能通車。問你上學有多少種走法?

技術分享 輸入描述 Input Description

共二行。

第一行包含兩個整數a和b,並且滿足1<=a,b<=16.

第二行包含一個整數n,表示有n個路口在維修(1<=N<=40)。

接下來的n行,每行兩個整數X_i、Y_i,描述路口的位置。

輸出描述 Output Description

輸出一個整數表示從(1,1)到(a,b)的騎車路線總數。

只有一行

樣例輸入 Sample Input

5 4

3

2 2

2 3

4 2

樣例輸出 Sample Output

5

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define N 100
using namespace std;
bool vis[N][N];
int n,m,p,x,y,ans;
int read()
{
    int x=0,f=1; char ch=getchar();
    
while(ch<0||ch>9){if(ch==-)f=-1; ch=getchar();} while(ch>=0&&ch<=9){x=x*10+ch-0; ch=getchar();} return x*f; } void dfs(int x,int y) { if(x==n&&y==m) {ans++; return ;} if(x<=n&&y+1<=m&&!vis[x][y+1]) dfs(x,y+1); if(x+1<=n&&y<=m&&!vis[x+1][y]) dfs(x+1,y); } int main() { n=read(),m=read(),p=read(); while(p--) x=read(),y=read(),vis[x][y]=true; dfs(1,1); printf("%d",ans); return 0; }

codevs——2693 上學路線(施工)