简单dp #include <iostream> #include <cstring> using namespace std; int main () { int step[35][35]; __int64 list[35][35]; char input[35]; int n; while(cin >> n && n != -1) { memset(list, 0, sizeof(list)); getchar(); for(int i = 0; i < n; ++i) { gets(input); for(int j = 0; j < n; ++j) { step[i][j] = input[j] - '0'; } } list[0][0] = 1; for(int i = 0; i < n; ++i) { for(int j = 0; j < n; ++j) { for(int k = 0; k < i; ++k) // 查找是否有从上面过来的路径 { if(list[k][j] && (step[k][j] + k)==i) { list[i][j] += list[k][j]; } } for(int k = 0; k < j; ++k) // 查找是否有从左边过来的路径 { if(list[i][k] && (step[i][k] + k)==j) { list[i][j] += list[i][k]; } } } } cout << list[n - 1][n - 1] << endl; } return 0; }