队列实现迷宫问题

来源:互联网 发布:nginx在windows配置 编辑:程序博客网 时间:2024/06/05 10:00
#include<stdio.h>#include<stdlib.h>int head=0,tail=0;//定义队列头和尾int maze[50][50];//定义迷宫int flag;//定义标志//打印路线//以maze各点的数转换为图形void result_maze(int m,int n){int i,j;printf("迷宫通路(用☆表示)如下所示:\n\t");for(i=0;i<m;i++){   printf("\n");for(j=0;j<n;j++){ if(maze[i][j]==0||maze[i][j]==2) printf("□"); if(maze[i][j]==1) printf("■"); if(maze[i][j]==3) printf("☆");}}printf("\n");}//手动生成迷宫void shoudong_maze(int m,int n){int i,j;printf("请输入0和1\n");for(i=0;i<m;i++) for(j=0;j<n;j++)   scanf("%d",&maze[i][j]);}//用结构体模拟队列//因为要打印,所以选择用数组和head,tail的偏移而不是指针分配和销毁来模拟struct point{int row,col,predecessor;//predecessor用于记录路径}queue[512];//入队操作void enqueue(struct point p){queue[tail]=p;tail++;}//出队操作struct point dequeue(){head++;return queue[head-1];}//判断是否为空int isempty(){return head==tail;}//遍历操作void visit(int row,int col,int maze[50][50]){struct point visitpoint={row,col,head-1};maze[row][col]=2;enqueue(visitpoint);}int mainfunction_migong(int maze[50][50],int m,int n){flag=1;struct point p={0 ,0, -1};if(maze[p.row][p.col]==1){printf("can't find the way\n'");flag=0;return 0;}maze[p.row][p.col]=2;enqueue(p);while(!isempty()){p=dequeue();if((p.row==m-1)&&(p.col==n-1)) break;if((p.col+1<n)&&(maze[p.row][p.col+1]==0)) visit(p.row,p.col+1,maze);if((p.row+1<m)&&(maze[p.row+1][p.col]==0)) visit(p.row+1,p.col,maze);if((p.col-1>=0)&&(maze[p.row][p.col-1]==0)) visit(p.row,p.col-1,maze);if((p.row-1>=0)&&(maze[p.row-1][p.col]==0)) visit(p.row-1,p.col,maze);    }//遍历四个方向if(p.row==m-1&&p.col==n-1){maze[p.row][p.col]=3;while(p.predecessor!=-1){p=queue[p.predecessor];//回去找可以走过来的点以便打印maze[p.row][p.col]=3;}}else{printf("can't find the way\n");flag=0;return 0;}}int main(){int m,n,t;printf("请输入测试数:\n");scanf("%d",&t);while(t--){printf("\n请输入行数:");scanf("%d",&m);printf("\n");printf("请输入列数:");scanf("%d",&n);shoudong_maze( m, n);mainfunction_migong(maze,m,n);if(flag!=0) result_maze(m,n);}    return 0; }

0 0
原创粉丝点击