#include #include #include #define MAXWT 9999 typedef struct { int rowidx; int colidx; } pair; typedef struct { int rowidx; int colidx; int weight; char type; } wpair; typedef struct { int m, n; int **H; int **V; pair **P; } maze; typedef int **path; typedef struct _node { int size; struct _node *P; } node; typedef node **MFT; 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 P) p = p -> P; return p; } void mergesets ( node *p, node *q ) { if (p -> size <= q -> size) { p -> P = q; q -> size += p -> size; } else { q -> P = p; p -> size += q -> size; } } void quicksort ( wpair *E, int n ) { int i, j, k, p; wpair t; if ((n == 0) || (n == 1)) return; p = E[0].weight; i = 0; j = 1; k = n-1; while (j <= k) { if (E[j].weight == p) ++j; else if (E[j].weight < p) { t = E[i]; E[i] = E[j]; E[j] = t; ++i; ++j; } else { t = E[j]; E[j] = E[k]; E[k] = t; --k; } } quicksort(E,i); quicksort(E+j,n-j); } void MSTmaze ( maze M ) { int m, n, i, j, k, l, s; wpair *E; MFT T; node *p, *q; m = M.m; n = M.n; s = 2*m*n-m-n; E = (wpair *)malloc(s * sizeof(wpair)); k = 0; for (i=0; i= 0) && (u < m) && (v >= 0) && (v < n) && (visited[u][v] == 0)) { rec = 0; switch (d) { case 0: if (M.V[u][v] == 0) rec = 1; break; case 1: if (M.H[u][v] == 0) rec = 1; break; case 2: if (M.V[i][j] == 0) rec = 1; break; case 3: if (M.H[i][j] == 0) rec = 1; break; } if (rec) { M.P[u][v] = (pair){i,j}; DFS(M, u, v, visited); } } } } void DFStree ( maze M ) { int **visited, i, j, m, n; 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); MSTmaze(M); printf("\n+++ Random maze generated\n"); prnmaze(M,NULL); DFStree(M); 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