收藏 分享(赏)

算法课程设计迷宫C实现七.docx

上传人:精品资料 文档编号:11199058 上传时间:2020-02-16 格式:DOCX 页数:13 大小:18.85KB
下载 相关 举报
算法课程设计迷宫C实现七.docx_第1页
第1页 / 共13页
算法课程设计迷宫C实现七.docx_第2页
第2页 / 共13页
算法课程设计迷宫C实现七.docx_第3页
第3页 / 共13页
算法课程设计迷宫C实现七.docx_第4页
第4页 / 共13页
算法课程设计迷宫C实现七.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

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();

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报