题意:一个图上有一些障碍物,问从左上角到右下角的最短路有几条。
题解:dp思路很简单,在一个可以走的点把他上方和左边的路径数量加到自己身上,主要是输入的处理比较麻烦,需要用读字符的方式读入障碍物的位置。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
const int N = 1005;
int t, row, col, m[N][N], f[N][N];
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d", &row, &col);
memset(m, 0, sizeof(m));
memset(f, 0, sizeof(f));
int temp1, temp2;
char c;
for (int i = 0; i < row; i++) {
scanf("%d", &temp1);
temp2 = 0;
while ((c = getchar()) == ' ');
if (c != '\n') {
while (1) {
if (isdigit(c))
temp2 = temp2 * 10 + c - '0';
else if (c == ' ') {
if (temp2 != 0) {
m[temp1][temp2] = 1;
temp2 = 0;
}
}
else if (c == '\n') {
if (temp2 != 0) {
m[temp1][temp2] = 1;
temp2 = 0;
}
break;
}
c = getchar();
}
}
}
f[1][1] = 1;
for (int i = 1; i <= row; i++)
for (int j = 1; j <= col; j++)
if (!m[i][j])
f[i][j] += f[i - 1][j] + f[i][j - 1];
printf("%d\n", f[row][col]);
if (t)
printf("\n");
}
return 0;
}