#include #include #include typedef struct { int rowidx; int colidx; } pair; typedef struct { int m, n; int **H; int **V; pair **P; } maze; typedef int **path; maze initmaze ( int m, int n ) { maze M; int i, j; M.m = m; M.n = n; M.H = (int **)malloc((m-1)*sizeof(int *)); for (i=0; i= 0) && (u < m) && (v >= 0) && (v < n) && (visited[u][v] == 0)) { M.P[u][v] = (pair){i,j}; switch (d) { case 0: M.V[u][v] = 0; break; case 1: M.H[u][v] = 0; break; case 2: M.V[i][j] = 0; break; case 3: M.H[i][j] = 0; break; } DFS(M, u, v, visited); } ++d; d %= 4; } } void genmaze ( maze M ) { int m, n, i, j; int **visited; m = M.m; n = M.n; visited = (int **)malloc(m * sizeof(int *)); for (i=0; i= 0) { p[t.rowidx][t.colidx] = 1; t = M.P[t.rowidx][t.colidx]; } t = (pair){x,y}; while (p[t.rowidx][t.colidx] == 0) { p[t.rowidx][t.colidx] = 1; t = M.P[t.rowidx][t.colidx]; } t = M.P[t.rowidx][t.colidx]; while (t.rowidx >= 0) { p[t.rowidx][t.colidx] = 0; t = M.P[t.rowidx][t.colidx]; } return p; } int main ( int argc, char *argv[] ) { int m, n, u, v, x, y; maze M; path p; srand((unsigned int)time(NULL)); if (argc >= 3) { m = atoi(argv[1]); n = atoi(argv[2]); } else { scanf("%d%d", &m, &n); } printf("m = %d\nn = %d\n", m, n); M = initmaze(m,n); printf("\n+++ Initial maze\n"); prnmaze(M,NULL); genmaze(M); printf("\n+++ Random maze generated\n"); prnmaze(M,NULL); do { u = rand() % m; v = rand() % n; x = rand() % m; y = rand() % n; } while ((u == x) && (v == y)); p = genpath(M, u, v, x, y); p[u][v] = 2; p[x][y] = 3; printf("\n+++ Path from S = (%d,%d) to T = (%d,%d)\n", u, v, x, y); prnmaze(M,p); for (u=0; u