1、算法课程设计迷宫 C 实现七/*欢迎进入我的迷宫*/#include stdio.h #include stdlib.h#include grahics.h /包含画图函数头文件 #include time.h /本题用于后面的随机函数的发生#include conio.h /本题用于 getch()#include rocess.h /本题用于清屏#define N 8#define MAX_STACK_SIZE N*N /最大栈容量 #define TRUE 1#define FALSE 0#define LEN (300/N)/*结构体记录每一步的横坐标纵坐标和方向*/tyedef st
2、ruct short int row;short int col;short int dir;element;element stackMAX_STACK_SIZE;/*结构体记录水平和垂直的偏移量*/tyedef struct short int vert; /水平偏移量short int horiz; /垂直偏移量offsets;offsets move8; /8 个方向的moveint mazeN+2N+2; /二维数组记录迷宫int markN+2N+2; /记录迷宫中每点是否可到达int EXIT_ROW = N, EXIT_COL = N; /标记最后出口/*在栈中加入一个素 */
3、void add(int *to, element item)if (*to = MAX_STACK_SIZE - 1) /判断栈是否已满 rintf(The stack is full!n); /栈满时输出return;/end ifstack+*to = item; /当前信息压进栈中/*返回栈中顶部的素*/element delet(int *to)if (*to = -1) /判断栈是否为空rintf(The stack is emty ! n);exit(1);/end ifreturn stack(*to)-; /不为空时输出栈顶素 /*输出走出迷宫的径*/void ath(voi
4、d)int i, j, k, row, col, next_row, next_col, dir, found = FALSE;IMAGE ; /*-*| i - 用来循环计数 | row , col - 当前位置的坐标 | next_row - 移动后的位置的横坐标 | next_col - 移动后的位置的纵坐标 | dir - 移动的方向 | found - 标志径是否发现 |*-*/element osition;int to = 0;mark11 = 1; /由于标志 maze11已经被走过了stack0.row = 1;stack0.col = 1;stack0.dir = 1; /
5、第一步的状态move0.vert = -1; move0.horiz = 0 ;move1.vert = -1; move1.horiz = 1 ;move2.vert = 0 ; move2.horiz = 1 ;move3.vert = 1 ; move3.horiz = 1 ;move4.vert = 1 ; move4.horiz = 0 ;move5.vert = 1 ; move5.horiz = -1;move6.vert = 0 ; move6.horiz = -1;move7.vert = -1; move7.horiz = -1; /指定了八个方向initgrah(640,
6、480); /VGAHI 将屏幕调整为 VGA 模式下的 16 色分辨率为 640*480 /*-*| 主要算法描述: | 当 stack 不为空, 移动到 stack 顶部的位置 | 试着向各个方向移动如果可以移动就移动到 | 下一个位置并把它标志成 1。 | 然后保存状态并加入到 stack 中 | 如果径被破坏或者不存在就将其删除 | 并返回到上一点继续遍历其他方向的点 | 直到一条径被发现。 |*-*/while ( to -1 !found) /stack不为空,且没有找到径osition = delet(to); /删除 stack 中的素row = osition.row;col
7、 = osition.col;dir = osition.dir;while (dir 8 !found) /方向小于 8 且没有找到next_row = row + movedir.vert; /下一步要走的点的行=当前行+行偏移量next_col = col + movedir.horiz; /下一步要走的点的列=当前列+列偏移量if (next_row = EXIT_ROW next_col = EXIT_COL)found = TRUE; /发现径else if ( !mazenext_rownext_col !marknext_rownext_col)/如果这点没有被走过并且可以走m
8、arknext_rownext_col = 1; /走过后将 mark 设成1osition.row = row;osition.col = col;osition.dir = dir; /方向最后标志为 07add(to, osition); /将有的点再加入到 stackrow = next_row; col = next_col; dir = 0; /移动到下一个点 /end else ifelse +dir; /尝试其他方向/end nei while/end wai whilefor(j=1;j=N;j+)for(k=1;k=N;k+)setcolor(WHITE); /设置颜色ci
9、rcle(j*LEN,k*LEN,11); /在以(j*LEN-2,k*LEN-2)点以 11 为半径画圆setcolor(GREEN);outtextxy(j*LEN-5,k*LEN-5,mazekj?1:0);/x,y 坐标输出文字if (found) /如果发现径则打印出来outtextxy(20,10,The ath is: );outtextxy(10,320,请按任意键然后你将手动走迷宫);setcolor(YELLOW);for (i=0; i to;i+)line(stacki.col*LEN, stacki.row*LEN,stacki+1.col*LEN,stacki+1.
10、row*LEN); /在以栈的两个素为顶点的不能为 i=to 因为 i=to 时 i+1 就出栈了line(stacki.col*LEN, stacki.row*LEN,col*LEN,row*LEN);/连栈顶素和下一个点line(col*LEN, row*LEN,EXIT_COL*LEN,EXIT_ROW*LEN); /连上最后一个素/*实现笑脸走径*/circle(250,330, 10); line(244,324,248,324); line(252,324,256,324);line(248,336,252,336); /画笑脸getimage(,240,320,21,21); /
11、获得笑脸for (i=0; i=to;i+)utimage(stacki.col*LEN-10,stacki.row*LEN-10, );getch(); /让笑脸按径走utimage(col*LEN-10,row*LEN-10, );getch(); /让笑脸走到倒数第二个因为他不在栈中utimage(EXIT_COL*LEN-10,EXIT_ROW*LEN-10, ); /让笑脸走到最后一个getch(); /*/ /end if /把下一个点和出口连上 else outtextxy(20,10,The maze does not have a ath);/否则打印不存在信息/*主函数*/
12、void main() int i, j, c;/system(cls); /调用清屏函数 for (i=0;iN+2;i+)maze0i=1; mazei0=1;mazeN+1i=1;mazeiN+1=1; /将迷宫的四周设为 1(墙壁) rintf(欢迎进入我的迷宫n);rintf(Would you like to inut the maze by youself?nYes or No?n);c = getchar();if(c=Y | c= y) /大些小写都可rintf(Enter the %d * %d maze:n,N,N); /手动输入for (i=1; iN+1; i+)fo
13、r(j=1; jN+1; j+)scanf(%d,mazeij); /end ifelse srand(unsigned)time(NULL); rintf(The maze is created by the comuter:n);for (i=1; iN+1; i+)for(j=1; jN+1; j+)mazeij=rand()%2;mazeNN = 0; maze11 = 0; /指定随机产生时第一个和最后一个素必须为 0for(i=1;iN+1;i+)for(j=1;jN+1;j+)rintf(%3d,mazeij); /输出数组rintf(n);/end elseath(); /调用函数ath() getch();