题目描述
一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数。
输入
第一行一个整数T 表示有T 组测试数据。(T <= 110)
对于每组测试数据:
第一行两个整数n, m,表示迷宫有n * m 个格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下来n 行,每行m 个数。其中第i 行第j 个数是0 表示第i 行第j 个格子可以走,否则是1 表示这个格子不能走,输入保证起点和终点都是都是可以走的。
任意两组测试数据间用一个空行分开。
输出
对于每组测试数据,输出一个整数R,表示有R 种走法。
示例输入
32 20 10 02 20 11 02 30 0 00 0 0
示例输出
1
0
4
#include #include using namespace std; int num; int x, y; int Map[8][8]; int d[4][2] = {{-1,0},{1,0}, {0, -1},{0, 1}}; bool judge(int m, int n, int d[]) { return m + d[0] >= 0 && m + d[0] < x && n + d[1] >= 0 && n + d[1] < y ; } void BFS(int m, int n) { Map[m][n] = 1; if(m == x - 1 && n == y - 1) num++; else { for(int i = 0; i < 4; i++) { if(judge(m, n ,d[i]) && Map[m + d[i][0]][n + d[i][1]] == 0) { Map[m + d[i][0]][n + d[i][1]] = 1; BFS(m + d[i][0],n + d[i][1]); Map[m + d[i][0]][n + d[i][1]] = 0; } } } Map[m][n] = 0; } int main() { int T; cin>>T; while(T--) { num = 0; cin>> x >> y; for (int i = 0; i < x; i++) for(int j = 0; j < y; j++) cin>>Map[i][j]; BFS(0, 0); cout<< num <
1125

被折叠的 条评论
为什么被折叠?



