题意:一个图上有一些障碍物,问从左上角到右下角的最短路有几条。

题解: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;
}