1751: 棋盘问题
题目描述:
给定一个M×N的棋盘,只能向下或者向右走,其中有一些点不能通过,问从左上角((0,0)点)到右下角((M-1,N-1)点)有多少种路径?
输入:
第一行两个数,M和N,表示M行N列。(0<M<=30,0<=N<=30)
接下来一个数T,表示有T个障碍点。
接下来T行,每行两个数X,Y,表示(X,Y)点有障碍。(0<=X<=M-1,0<=Y<=N-1)
输入保证(0,0)点和(M-1,N-1)点没有障碍
输出:
一个数,表示路径总数
样例输入
4 5 1 2 3
样例输出
15
嗯,这道题再次教会我们long long 的重要性,本不想打这道题,但看见某队友6次都没对,就试了试,然后妥妥是一发wa,然后发现是long long在卡数据。@某队友(๑╹◡╹)ノ"""
#include<iostream>
#include<memory.h>
using namespace std;
long long map[50][50];
int main()
{
int n;
int M, N;
while(cin >> M >> N)
{
memset(map, 0, sizeof(map));
cin >> n;
for(int i = 0;i < n;i ++)
{
int x, y;
cin >> x >> y;
x ++, y ++;
map[x][y] = -1;
}
map[1][0] = 1;
for(int x = 1;x <= M;x ++)
{
for(int y = 1;y <= N;y ++)
{
if(map[x][y] == -1)
continue;
if(map[x - 1][y] == map[x][y - 1] && map[x][y - 1] == -1)
{
map[x][y] = 0;
}
else if(map[x - 1][y] == -1 && map[x][y - 1] != -1)
{
map[x][y] = map[x][y - 1];
}
else if(map[x][y - 1] == -1 && map[x - 1][y] != -1)
{
map[x][y] = map[x - 1][y];
}
else
{
map[x][y] = map[x - 1][y] + map[x][y - 1];
}
}
}
cout << map[M][N] << endl;
}
}