UVa 825 - Walking on the Safe Side
假期放松,做几道小题……
这道题的输入比较不同:每行输入的数的个数是不确定的,所以要使用gets和sscanf();
开始想偷懒,看了看Stainger大牛的输入也是这样,就没啥可说了,麻烦些就麻烦些;
状态转移比较明显,递推可以解决,感觉这道题与其说是dp的,不如说是用来练习输入的;
1WA,原因是最后一组输出后不要留空行(留换行);
使用了 OIer 常用的写法:把程序每一部分独立起来,确实是方便了调试(在递推时 i 没有初始化,找了很久,最后一块一块注释,发现的)。
# include <stdio.h> # include <string.h> # define N 105 int row, col, f[N][N]; char t[N], map[N][N]; void read(void); void process(void); int main() { int T; gets(t); sscanf(t, "%d", &T); while (T--) { read(); process(); if (T != 0) putchar('\n'); } return 0; } void read(void) { int i, j, x, k; gets(t); gets(t); sscanf(t, "%d%d", &row, &col); for (i = 1; i <= row; ++i) { for (j = 1; j <= col; ++j) map[i][j] = 0; gets(t); k = 0; while (t[k] && t[k]==' ') ++k; while (t[k] && t[k]!=' ') ++k; while (t[k] && t[k]==' ') ++k; while (t[k]) { sscanf(t+k, "%d", &x); map[i][x] = 1; while (t[k] && t[k]==' ') ++k; while (t[k] && t[k]!=' ') ++k; } } } void process(void) { int i, j; f[1][1] = 1; for (j = 2; j <= col; ++j) { if (map[1][j]) f[1][j] = 0; else f[1][j] = f[1][j-1]; } for (i = 2; i <= row; ++i) { if (map[i][1]) f[i][1] = 0; else f[i][1] = f[i-1][1]; for (j = 2; j <= col; ++j) { if (map[i][j]) f[i][j] = 0; else f[i][j] = f[i-1][j] + f[i][j-1]; } } printf("%d\n", f[row][col]); }