/* maze.h : 迷路アルゴリズム関数定義部 (漢字コードを使用環境に合わせてください。) K. Shiota 2005.6.6 2005.6.10 version */ /* 迷路の縦横の最大サイズ MAXMAZESIZE^2 は MAXORDER を超えないこと */ #ifndef MAXMAZESIZE #define MAXMAZESIZE 16 #endif /* 迷路を表す構造体の定義 */ /* 縦サイズ = row、横サイズ = col、セルの隣接状況を表すグラフ = g */ /* セル (i,j) <-> g の col*i+j 番目の node */ typedef struct { int row,col; Graph g; } Maze; /* m × n のランダムな迷路を生成する */ Maze GenerateMaze(int m, int n) { Maze ma; int i,j,k,r,p,q; char x[MAXMAZESIZE][MAXMAZESIZE]; ma.g=EmptyGraph(m*n); // ma.g の初期値は空グラフ ma.row=m; ma.col=n; for(i=0;i0){ i=rand()%m; j=rand()%n; k=rand()%4; switch(k){ case 0: if(i>0 && x[i][j]==0 && x[i-1][j]==1){ p=(i-1)*n+j; q=i*n+j; ma.g.adj[p][q]=1; ma.g.adj[q][p]=1; x[i][j]=1; r--; break; } // 北のセルと結ぶ case 1: if(j>0 && x[i][j]==0 && x[i][j-1]==1){ p=i*n+(j-1); q=i*n+j; ma.g.adj[p][q]=1; ma.g.adj[q][p]=1; x[i][j]=1; r--; break; } // 西のセルと結ぶ case 2: if(i0){ if(i1i2) x[2*i2+2][2*j2+1]='.'; if(j1j2) x[2*i2+1][2*j2+2]='.'; } } for(i=0;i<=2*m.row;i++){ for(j=0;j<=2*m.col;j++){ if(x[i][j]==' ') printf(" "); if(x[i][j]=='#') printf("□"); if(x[i][j]=='.') printf("・"); } printf("\n"); } }