1 #include <iostream> 2 #include<cstdio> 3 #include<stdlib.h> 4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */ 5 using namespace std; 6 #define N 39 7 #define M 39 8 int X; 9 10 int maze[N+2][M+2]; 11 struct point{ 12 int row,col,predecessor; 13 }queue[512]; 14 int head=0,tail=0; 15 16 void shoudong_maze(int m,int n){ 17 int i,j; 18 printf("\n\n"); 19 printf("请按行输入迷宫 0表示通路1表示障碍:\n\n"); 20 21 for(i=0;i<m;i++) 22 for(j=0;j<n;j++) 23 scanf("%d",&maze[i][j]); 24 } 25 26 void zidong_maze(int m,int n){ 27 int i,j; 28 printf("\n迷宫生成中......\n\n"); 29 system("pause"); 30 for(i=0;i<m;i++) 31 for(j=0;j<n;j++) 32 maze[i][j]=rand()%2; 33 /*由于rand()产生的随机数是从0到RAND_MAX*/ 34 /*RAND_MAX是定义在stdlib.h中的,其值至少为32767)*/ 35 /*要产生从X到Y的数,只需要这样写k=rand()%(Y-X+1)+X;*/ 36 } 37 38 void print_maze(int m,int n){ 39 int i,j; 40 printf("\n迷宫生成结果如下:\n"); 41 printf("迷宫入口\n"); 42 printf("↓"); 43 44 for(i=0;i<m;i++){ 45 printf("\n"); 46 for(j=0;j<n;j++){ 47 if(maze[i][j]==0) printf("□"); 48 if(maze[i][j]==1) printf("■"); 49 50 } 51 } 52 printf("→迷宫出口\n"); 53 } 54 55 void result_maze(int m,int n){ 56 int i,j; 57 printf("迷宫通路(用☆表示)如下所示\n\t"); 58 59 for(i=0;i<m;i++){ 60 printf("\n"); 61 for(j=0;j<n;j++){ 62 if(maze[i][j]==0||maze[i][j]==2) printf("□"); 63 if(maze[i][j]==1) printf("■"); 64 if(maze[i][j]==3) printf("☆"); 65 } 66 } 67 } 68 69 void enqueue(struct point p){ 70 queue[tail]=p; 71 tail++; 72 } 73 74 struct point dequeue(){ 75 head++; 76 return queue[head-1]; 77 } 78 79 int is_empty(){ 80 return head==tail; 81 } 82 83 void visit(int row,int col,int maze[41][41]){ 84 struct point visit_point={row,col,head-1}; 85 maze[row][col]=2; 86 enqueue(visit_point); 87 } 88 89 int mgpath(int maze[41][41],int m,int n){ 90 X=1; 91 struct point p={0,0,-1}; 92 if(maze[p.row][p.col]==1){ 93 printf("\n==============================================\n"); 94 printf("此迷宫无解\n\n"); 95 X=0; 96 return 0; 97 } 98 maze[p.row][p.col]=2; 99 enqueue(p); 100 while(!is_empty()){ 101 p=dequeue(); 102 if((p.row==m-1)&&(p.col==n-1)) break; 103 if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze); 104 if((p.row+1<m)&&(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze); 105 if((p.col-1>=0)&&(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze); 106 if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze); 107 } 108 if(p.row==m-1&&p.col==n-1) 109 { 110 printf("\n==================================================================\n"); 111 printf("迷宫路径为\n"); 112 printf("(%d,%d)\n",p.row,p.col); 113 maze[p.row][p.col]=3; 114 while(p.predecessor!=-1) 115 { 116 p=queue[p.predecessor]; 117 printf("(%d,%d)\n",p.row,p.col); 118 maze[p.row][p.col]=3; 119 } 120 }else{ 121 printf("\n=============================================================\n"); 122 printf("此迷宫无解\n\n"); 123 X=0; 124 } 125 return 0; 126 } 127 int main(int argc, char** argv) { 128 int i,m,n,cycle=0; 129 while(cycle!=(-1)){ 130 printf("********************************************************************************\n"); 131 printf(" 欢迎进入迷宫求解系统\n"); 132 printf(" \n"); 133 134 printf("********************************************************************************\n"); 135 136 printf(" ☆手动生成迷宫 请按1\n"); 137 138 printf(" ☆自动生成迷宫 请按2\n"); 139 140 printf(" ☆退出 请按3\n\n"); 141 142 printf("********************************************************************************\n"); 143 printf("\n"); 144 145 printf("请选择你的操作\n"); 146 scanf("%d",&i); 147 148 switch(i){ 149 case 1: 150 printf("\n请输入行数"); 151 scanf("%d",&m); 152 printf("\n"); 153 printf("请输入列数"); 154 scanf("%d",&n); 155 while((m<=0||m>39)||(n<=0||n>39)) 156 { 157 printf("\n抱歉你输入的行列数超出预设范围(0-39,0-39),请重新输入\n\n"); 158 printf("请输入行数"); 159 scanf("%d",&m); 160 printf("\n"); 161 printf("请输入列数"); 162 scanf("%d",&n); 163 } 164 shoudong_maze(m,n); 165 print_maze(m,n); 166 mgpath(maze,m,n); 167 if(X!=0) result_maze(m,n); 168 printf("\n\nPress Enter Contiue!\n"); 169 getchar(); 170 while(getchar()!='\n'); 171 break; 172 case 2: 173 printf("\n请输入行数"); 174 scanf("%d",&m); 175 printf("\n"); 176 printf("请输入列数"); 177 scanf("%d",&n); 178 while((m<=0||m>39)||(n<=0||n>39)) 179 { 180 printf("\n抱歉你输入的行列数超出预设范围(0-39,0-39),请重新输入\n\n"); 181 printf("请输入行数"); 182 scanf("%d",&m); 183 printf("\n"); 184 printf("请输入列数"); 185 scanf("%d",&n); 186 } 187 zidong_maze(m,n); 188 print_maze(m,n); 189 mgpath(maze,m,n); 190 if(X!=0) result_maze(m,n); 191 printf("\n\nPress Enter Contiue!\n"); 192 getchar(); 193 while(getchar()!='\n'); 194 break; 195 case 3: 196 cycle=(-1); 197 break; 198 default: 199 printf("\n"); 200 printf("你的输入有误!\n"); 201 printf("\nPress Enter Contiue!\n"); 202 getchar(); 203 204 205 while(getchar()!='\n'); 206 break; 207 208 209 } 210 211 } 212 return 0; 213 }
太牛逼了!