迷宫问题c语言 迷宫问题c语言课程设计目标
C语言基础知识总结大全
for( int i=0;i<4;i++){C语言基础知识总结大全如下:
迷宫问题c语言 迷宫问题c语言课程设计目标
迷宫问题c语言 迷宫问题c语言课程设计目标
1、入门程序
2、数据类型
数据类型:
1.基本数据类型:
1.1. 整型:int 4个字节
1.2. 字符型:char 1个字节
1.3. 实型(浮点型)
1.3.1.单精度型:float 4个字节
1.3.2.双精度型:double 8个字节
2.构造类型:
2.1.枚举类型
2.2.数组类型
2.3.结构体类型
2.4.共用体类型
3.指针类型:
4.空类型:
3.格式化输出语句
%d:十进制整数;
%c:单个字符;
%s:字符串;
%f:6位小数;
4.常量
值不发生改变的量成为常量;
定义字符常量(注意后面没有;)
5.运算符
5.1.算数运算符:+,-,,/,%,++,--;前++/--,先运算,再取值.后++/--,先取值,再运算;
5.2.赋值运算符:
5.3.关系运算符;
5.4.逻辑运算符;
5.5.三目运算符:
表达式1 ? 表达式2 : 表达式3;
6.水仙花数计算
输出所有三位数的水仙花数字
所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数,如:153就是一个水仙花数,153=111+555+333。
7.打印正三角形的
8.臭名远扬的goto语句
很少使用
9.形参与实参
形参:形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数;
实参:实参是在调用时传递该函数的参数。
函数的形参和实参具有以下特点:
形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值等办法使实参获得确定值。
在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
10.函数返回值注意
注意:void函数中可以有执行代码块,但是不能有返回值,另void函数中如果有return语句,该语句只能起到结束函数运行的功能。其格式为:return;
11.递归
12.变量存储类别 !
12.1.生存周期划分存储方式
C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。
用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动int main()态存储方式。
用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。
注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)
为了提高效率,C语言允许将局部变量的值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。
注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。
用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。
13.内部函数外部函数 !
在C语言中不能被其他源文件调用的函数称为内部函数 ,内部函数由static关键字来定义,因此又被称为静态函数,形式为:
static [数据类型] 函数名([参数])
这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。
在C语言中能被其他源文件调用的函数称为外部函数 ,外部函数由extern关键字来定义,形式为:
extern [数据类型] 函数名([参数])
C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。 extern可以省略; 14.数组 数组:一块连续的,大小固定并且里面的数据类型一致的内存空间, 数组的声明:数据类型 数组名称[长度n]
数据类型 数组名称[长度n] = {元素1,元素2,元素3,......};
数据类型 数组名称[] = {元素1,元素2,元素3,......};
数类类型 数组名称[长度n]; 数组名称[0] = 元素1;数组名称[1] = 元素2;...... 注意: 1、数组的下标均以0开始;
2、数组在初始化的时候,数组内元素的个数不能大于声明的数组长度。
3、如果采用种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0; 4、在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。
15.数组遍历
数组的冒泡排序
冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。
字符串与数组
在C语言中,是没有办法直接定义子字符串数据类型的,需使用数组来定义所要的字符串,形式如下:
char 字符串名称[长度] = "字符串内容";
char 字符串名称[长度] = {'字符串1','字符串2',....,'字符串n','0'};
[]中的长度可以省略不写;
采用第二种方式一个元素必须是'0',表示结束;
第二种方式不能写中文!; 输出字符串时,要使用:printf("%s",字符数组名);或puts(字符数组名);
16.字符串函数
strlen(s):获取字符串s的长度;
strcmp(s1,s2):比较字符串;比较的时候会把字符串转换成ASCII码再进行比较,返回结果为0表示s1和s2的ASCII码值相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ACSII码小;
strcpy(s1,s2):字符串拷贝;s2会取代s1中的内容;
strcat(s1,s2)将s2拼接到s1后面;注意:s1的length要足够才可以!
atoi(s1)将字符串转为整数!
17.数组
数据类型 数组名称[常量表达式1]...[常量表达式n];
数组的初始化与一维数组的初始化类似也是分两种:
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n]; 数组名称[下标1][下标2]...[下标n] = 值;
数组初始化要注意以下事项:
采用种始化时数组声明必须指定列的维数。因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
采用第二种初始化时数组声明必须同时指定行和列的维数。
18.度数组的遍历
使用嵌套循环
注意:数组的每一维下标均不能越界!
19.结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
结构用于表示一条记录,设您想要跟踪图书馆中书本的动态,您可能需要跟踪每本书的下列属性:
Title
Author
Subject
Book ID
定义结构
为了定义结构,您必须使用 struct 语句。struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:
tag 是结构体标签。
member-list 是标准的变量定义,比如 int i; 或者 float f,或者其他有效的变量定义。
variable-list 结构变量,定义在结构的末尾,一个分号之前,您可以指定一个或多个结构变量。下面是声明 Book 结构的方式:
在一般情况下,tag、member-list、variable-list 这 3 部分至少要出现 2 个。以下为实例:
访问结构成员
为了访问结构的成员,我们使用成员访问运算符(.)。成员访问运算符是结构变量名称和我们要访问的结构成员之间//当前位置可通则返回TURE,否则返回FALSE的一个句号。您可以使用 struct 关键字来定义结构类型的变量。下面的实例演示了结构的用法:
20.共用体
共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。
21.指针
22.文件读写
写入文件
读取文件
C语言与C++学习路线
23.排序算法
十大经典排序算法(动态演示+代码)
24.查找算法
九种查找算法
C语言与C++面试知识总结
26.字符串作
字符串作的全面总结
27. C语言常用标准库解读
C语言常用标准库解读
28. C语言最常用的贪心算法
C语言最常用的贪心算法就这么被攻克了
29. 常见的C语言内存错误及对策
常见的C语言内存错误及对策
30. C语言实现面向对象的原理
C语言实现面向对象的原理
31. C语言/C++内存管理
看完这篇你还能不懂C语言/C++内存管理?
32. 再谈C语言指针
再谈指针:大佬给你拨开 C 指针的云雾
C语言函数指针之回调函数
C语言指针详解(文末有)
33. C语言预处理命令
长文详解:C语言预处理命令
34. C语言高效编程与代码优化
C语言高效编程与代码优化
35. C语言结构体
C语言之结构体就这样被攻克了!值得收藏!
36. 原码, 反码, 补码 详解
原码, 反码, 补码 详解
37. C语言宏定义
简述C语言宏定义的使用
38. c语言之共用体union、枚举、大小端模式
c语言之共用体union、枚举、大小端模式
C 语言可以零基础入门,它的语法是很多高级编程语言的基础,比如说 Ja、C++;并且起到承上启下的作用,向上可以学习高级编程语言,向下可以学习计算机组成原理、作系统等等偏基础的计算机基础知识。
书籍
本书《阿哈C语言》的写书风格个人认为比较风趣幽默,对于培养兴趣,基础学习还是很不错的
《C程序设计语言》,机械工业出版社,作者Brian W. Kernighan / (美)Dennis M. Ritchie。C 语言之父写的,入门经典书籍。
《C Primer Plus》 ,邮电出版社,作者 Stephen Prata。 可以作为 C 语言工具书,也可以作为入门,内容循序渐进,能够锻炼编程思想。
《C和指针》 深入了解指针,看完以后对指针不再害怕。
《C陷阱与缺陷》 正如书上所说,“本书所揭示的知识,至少能够帮助你减少 C 代码和初级 C++ 代码中 90% 的 Bug”,看完后可以避免 C 语言开发的一些坑。
网课
1、《郝斌C语言自学教程》
2、《程序设计入门——C语言》(浙大翁恺)
小项目
包括C语言迷宫、24点游戏、奔跑的火柴人、超市管理系统、打字母、电子时钟、对对碰、方块、黑白棋、华容道、火车票订票管理源码、连连看、商品销售系统、象棋、超级玛丽、图书管理系统、学生成绩管理系统。
用栈的方法设计迷宫求解(c语言)。。限时
exit(OVERFLOW);#include"stdio.h"
exit(OVERFLOW); //初始化错误#define M 6
#define N 8
#define MAX 100
typedef struct
{ int x;
int y;
};
typedef struct
{ int x,y,d;
}sanyuan;
typedef struct
{ sanyuan elem[MAX];
int top;
}sqstack;
void Initstack(sqstack s)
{s->top=-1;}
int stackempty(sqstack s)
{if(s->top==-1) return 1;
else return 0;}
void push(sqstack s,sanyuan e)
{if(s->top==MAX-1)
{printf("stack is fulln");
return;}for (i=0;i s->top++;s->elem[s->top]=e;} sanyuan pop(sqstack s,sanyuan e) {e=s->elem[s->top]; s->top--; return e; }void printpath(sqstack s) {sanyuan temp; printf("(%d,%d)<==",M,N); while(!stackempty(s)) {temp=pop(s,temp); printf("(%d,%d)<==",temp.x,temp.y); }printf("n"); }int mazepath() {int maze[M+2][N+2]={{1,1,1,1,1,1,1,1,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,1,0,1,1,1,1,1},{1,0,1,0,0,0,0,0,1,1},{1,0,1,1,1,0,1,1,1,1},{1,1,0,0,1,1,0,0,0,1},{1,0,1,1,0,0,1,1,0,1},{1,1,1,1,1,1,1,1,1,1}}; move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; sqstack s;sanyuan temp; int x,y,d,i,j; Initstack(s); temp.x=1;temp.y=1;temp.d=-1; push(s,temp); while(!stackempty(s)) {pop(s,temp); x=temp.x;y=temp.y;d=temp.d+1; while(d<8) {i=x+move[d].x; j=y+move[d].y; if(maze[i][j]==0) {temp.x=x;temp.y=y;temp.d=d; push(s,temp); x=i;y=j; maze[x][y]=-1; return 1; }else d=0; }else d++; }} return 0; {mazepath(); } #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define IN99v_SIZE 100 //存储空间初始分配量 #define INCREMENT 30 //存储空间分配增量 #define MAXLEN 100//迷宫包括外墙行列数目 typedef struct{ //迷宫中row行col列的位置 int row; int col; }PostType; typedef struct{ int ord; //当前位置在路径上的序号 PostType seat;//当前坐标 int di; //往下一坐标的方向 }SElemType; //栈元素类型 typedef struct{ SElemType base;//栈基址,构造前销毁后为空 SElemType top;//栈顶 int stackSize; //栈容量 }Stack; //栈类型 Status InitStack(Stack &S){ //构造空栈s S.base=(SElemType)malloc(IN99v_SIZE sizeof(SElemType)); if(!S.base) exit(OVERFLOW);//存储分配失败 OK; }//InitStack Status StackEmpty(Stack S){ //若s为空返回TRUE,否则返回 TRUE; return FALSE; }//StackEmpty Status Push(Stack &S,SElemType e){ //插入元素e为新的栈顶元素 >=S.stackSize){//栈满,加空间 S.base=(SElemType )realloc(S.base,(S.stackSize+INCREMENT)sizeof(SElemType)); if(!S.base) exit(OVERFLOW); //存储分配失败} OK; }//push Status Pop(Stack &S,SElemType &e){//若栈不空删除栈//顶元素用e返回并返回OK,否则返回 OK; }//Pop Status DestroyStack(Stack &S){//销毁栈 OK; }//DestroyStack.. typedef struct{ int row; int col; char adr[MAXLEN][MAXLEN];//可取' ''001' '002' '#' }MazeType; //迷宫类型 Status InitMaze(MazeType &maze){ //初始化迷宫若成功返回TRUE,否则返回FALSE int m,n,i,j; maze.row=0; maze.col=0; while(maze.row>50 || maze.row<5){ printf("请输入所要创建迷宫的行数:"); scanf("%d",&maze.row); //迷宫行数 if(maze.row>=50 || maze.row<=5) printf("行数必须是5-50之间的整数n"); continue; if(maze.row<=50 && maze.row>=5) break;} while(maze.col>50 || maze.col<5){ printf("请输入所要创建迷宫的列数:"); scanf("%d",&maze.col); if(maze.col>=50 || maze.col<=5) printf("列数必须是5-50之间的整数n"); continue; if(maze.col<=50 && maze.col>=5) break;} for(i=0;i<=maze.col+1;i++){//迷宫行外墙 maze.adr[0][i]='#'; maze.adr[maze.row+1][i]='#';}//for for(i=0;i<=maze.row+1;i++){//迷宫列外墙 maze.adr[i][0]='#'; maze.adr[i][maze.col+1]='#';} for(i=1;i<=maze.row;i++) for(j=1;j<=maze.col;j++) maze.adr[i][j]=' ';//初始化迷宫 printf("下面请输入你的障碍坐标n注:当设置好障碍坐标后,输入数字0 后结束。"); do{ printf("n请输入障碍的横坐标: "); scanf("%d",&m); if(m==0)break; if(m>maze.row){ printf("输入的数不能超过行数n"); continue;} if(m<0){ printf("输入的数不能比1小n"); continue;} printf("请输入障碍的纵坐标: "); scanf("%d",&n); if(n==0)break; if(n>maze.col){ printf("输入的数不能超过列数n"); continue;} if(n<0){ printf("输入的数不能比1小n"); continue;} maze.adr[m][n]='#';//迷宫障碍用'#'标记 }while(m!=0||n!=0);//while return OK; }//InitMaze Status Pass(MazeType maze,PostType cur){ if(maze.adr[cur.row][cur.col]==' ')//可通 return TRUE; else return FALSE; }//Pass Status FootPrint(MazeType &maze,PostType cur){ //若走过并且可通返回TRUE,否则返回FALSE //在返回之前销毁栈S maze.adr[cur.row][cur.col]='001';//"001"表示可通 return OK; }//FootPrint PostType NextPos(PostType &cur,int i){ //指示并返回下一位置的坐标 PostType c; c=cur; switch(i){ //1.2.3.4分别表示东,南,西,北方向 case 1 : c.col+=1; break; case 2 : c.row+=1; break; case 3 : c.col-=1; break; case 4 : c.row-=1; break; default: exit(ERROR);} return c; }//Next Status MarkPrint(MazeType &maze,PostType cur){ //曾走过但不是通路标记并返回OK maze.adr[cur.row][cur.col]='002';//"002"表示曾走过但不通 return OK; }//MarkPrint Status MazePath(MazeType &maze,PostType start,PostType _end){ //若迷宫maze存在从入口start到_end的通道则求得一条存放在栈中 //并返回TRUE,否则返回FALSE Stack S; PostType cur; int curstep;//当前序号,1.2.3.4分别表示东,南,西,北方向 SElemType e; InitStack(S); cur=start; //设置"当前位置"为"入口位置" curstep=1; //探索步 do{ if(Pass(maze,cur)){//当前位置可以通过, //即是未曾走到过的通道 FootPrint(maze,cur);//留下足迹 e.ord=curstep; e.seat=cur; e.di=1; Push(S,e); //加入路径 if(cur.row==_end.row&& cur.col==_end.col) else return TRUE; //到达出口 else{ cur=NextPos(cur,1); //下一位置是当前位置的东邻 curstep++; //探索下一步 }//else }//if else{ //当前位置不通 if(!StackEmpty(S)){ Pop(S,e); while(e.di==4 && !StackEmpty(S)){ MarkPrint(maze,e.seat); Pop(S,e); //留下不能通过的标记,并退一步 }//while if(e.di < 4){ Push(S,e); //新方向上的相邻 }//if }//if }//else }while(!StackEmpty(S)); else return FALSE; }//MazePath void PrintMaze(MazeType &maze){ //将标记路径信息的迷宫输出到终端(包括外墙) int i,j; printf("n迷宫路径如下图所示:nn"); printf(" "); for(i=0;i<=maze.col+1;i++)//打印列数名 printf("%4d",i); printf("nn"); for(i=0;i<=maze.row+1;i++){ printf("%2d",i);//打印行名 for(j=0;j<=maze.col+1;j++) printf("%4c",maze.adr[i][j]);//输出迷宫//当前位置的标记 printf("nn"); }}//PrintMaze void main(){ //主函数 PostType start,_end; char cmd; do{ ("cls"); printf("##########################################################################n"); printf("# 迷宫求解 #n"); printf("# 姓名: 班级: 学号: #n"); printf("# 欢迎使用 copy left #n"); printf("##########################################################################n"); if(!InitMaze(maze)){ //初始化并创建迷宫 printf("nInitialization errors!!!n"); }do{ //输入迷宫入口坐标 printf("n输入迷宫入口坐标: "); scanf("%d%d",&start.row,&start.col); if(start.row>maze.row || start.row<1|| start.col>maze.col || start.col<1) { printf("n入口错误!!!n"); continue;} }while(start.row>maze.row || start.row<1 || start.col>maze.col || start.col<1); do{ //输入迷宫出口坐标 printf("n输入迷宫出口坐标: "); scanf("%d%d",&_end.row,&_end.col); if(_end.row>maze.row || _end.row<1 || _end.col>maze.col || _end.col<1){ printf("n出口错误!!!n"); continue;} }while(_end.row>maze.row || _end.row<1 || _end.col>maze.col || _end.col<1); if(!MazePath(maze,start,_end))//迷宫求解 printf("n此路不通!!!n"); else PrintMaze(maze);//打印路径 printf("n如果继续请输入y,退出请输入n: "); scanf("%s",&cmd); }//main 迷宫求解问题用C++编写. 1. 迷宫问题 ///////////////////////// /////////迷宫求解//////// /////时间:11.10.2006///// ///////////////////////// //Migong.h //利用栈进行回溯 /class: Matrix:矩阵类 enum directions:四个方向 struct :搜索 Migong:迷宫类 1.创建一个Migong对象 2.使用用Create方法输入数据 3.使用Solve方法进行求解 4.ShowSolve方法显示解 5.可以重复使用Create方法 6.入口只能在左上角 7.默认出口在右下角 ShowAllPath:穷举所有的路径 备注: 由于算法原因,这里的所有路径应该是指 介于: a.如果两条路存在某个点不同那么就是不同的路 b.如果在一条路中去掉一个或者一个以上的圈,那么他们是同一条路 之间意义上的路 / #include #include #include using namespace std; #ifndef MIGONG_H #define MIGONG_H /////////////////// ///////矩阵类////// /////////////////// class Matrix{ int m; int row, col; bool iscreate; public: Matrix(){m=0;iscreate=false;}; ~Matrix() {Release();}; bool Create(int, int); int& operator () (int, int); int GetRow(){return row;}; int GetCol(){return col;}; void Release(); void Show(char, char ); }; bool Matrix::Create(int r, int c) {if( r<=0 || c<=0) return false; Release(); row = r; col = c; m = new int[rowcol]; for (int i=0;i {(m+i) = 0; }iscreate = true; }int& Matrix::operator ()(int r, int c) {return (m+rcol+c); }void Matrix::Release() {if (iscreate) {row = col = 0; if (m) delete[] m; m = 0; }iscreate = false; }void Matrix::Show(char blk='#', char nblk=' ') {int i, j; {for (j=0;j {if ((m+icol+j) == 0) cout< else cout< }cout< }} ///////////////////////////// ////迷宫相关数据结构的定义/// ///////////////////////////// struct offsets{ int a, b; }; enum directions{ _S = 0, _E, _N, _W }; struct { int row, col, dir; }; class Migong{ static offsets move[4]; Matrix maze; Matrix mark; int row; int desr; int desc; stack<> stk; bool iscreate; int pathlength; bool GetPath(); bool IsInPath(int, int); public: Migong(){issolved=false;result=0;pathlength=row=col=0;iscreate=false;}; ~Migong(){Release();}; bool Create(int , int , int , int , int ); void Solve(); void Release(); void OutputMaze(); void ShowSolve(char, char ); public: bool issolved; result; }; offsets Migong::move[4]={ {1, 0}, {0, 1}, {-1, 0}, {0, -1}}; //////////////////////////// //迷宫数据应该是不含边框的// //////////////////////////// bool Migong::Create(int m, int r, int c, int desrow=-1, int descol=-1) {if (r<=0 || c<=0) return false; Release(); if (desrow==-1 || descol==-1) {desr = r; desc = c; }else {desr = desrow; desc = descol; }row = r; col = c; maze.Create(r+2, c+2); for (i=0;i {for (j=0;j {if (j==0 || j==c+1 || i==0 || i==r+1) {mark(i, j) = maze(i, j) = 1; }else {mark(i, j) = 0; maze(i, j) = m[((i-1)col+j-1)]; }} }return iscreate = true; }bool Migong::GetPath() temp; temp.col = 1; temp.row = 1; temp.dir = _S; stk.push(temp); while (!stk.empty()) {temp = i = temp.row; int j = temp.col; int d = temp.dir; while (d<4) {//根据当前点的状态确定下一个搜索点 int g = i + move[d].a; int h = j + move[d].b; if (g==desr && h==desc) {return true; }//如果这个点不是障碍点且没有被搜索过那么可以对这个点进行搜索 if (maze(g, h)==0 && mark(g, h)==0) {mark(g, h) = 1; temp.row = g; temp.col = h; temp.dir = d+1; stk.push(temp); i = g; j = h; d = _S;//对一下个点进行搜索 }else d++; }} return false; }void Migong::Solve() {issolved = GetPath(); if (issolved) {pathlength = stk.size(); result = new [pathlength]; for (int i=0;i {(result+i) = cout<<"("<<((result+i)).row<<","<<((result+i)).col<<")"< }} while (!stk.empty()) stk.pop(); }void Migong::Release() {if (iscreate) {maze.Release(); mark.Release(); row=col=0; if (result) delete [] result; result = 0; while (!stk.empty()) stk.pop(); }iscreate = false; issolved = false; pathlength = 0; }void Migong::OutputMaze() {if (!iscreate) return; maze.Show(); }bool Migong::IsInPath(int r, int c) {if (!iscreate || !issolved) return false; temp; for (int i=0;i {temp = (result+i); if ((temp.row==r) && (temp.col==c)) }return false; }void Migong::ShowSolve(char blk='#',char s='o') {if (!iscreate) return; if (!issolved) {cout<<"无解"< }else {int i, j; for (i=0;i {for (j=0;j {if ((i==1 && j==1) || (i==desr && j==desc)) {cout< }else if (maze(i, j) == 1) {cout< }else {if (IsInPath(i, j)) cout< else cout<<' '; }} }} }////////////////////// //////穷举所有路径//// ////////////////////// offsets move[4]={ {1, 0}, {0, 1}, {-1, 0}, {0, -1}}; struct node {int row,col; }; vector int count; bool IsReachable( Matrix& maze, Matrix& mark, node beg, node des) {if (beg.row==des.row&&beg.col==des.col) {//如果达到的话那么显示路径 count++; cout<<"第"< for (int i=0;i cout<<"("< cout<<"("< return false; }if (maze(beg.row, beg.col)==1 || mark(beg.row, beg.col)==1) {return false; }path.push_back(beg); mark(beg.row, beg.col) = 1; node nextnode; for (int i=_S;i<_W+1;i++) {nextnode.row = beg.row + move[i].a; nextnode.col = beg.col + move[i].b; }path.resize(path.size()-1); mark(beg.row, beg.col) = 0; return false;//如果不是穷举的话应该根据for循环的结果重新设置返回值 }/ 参数maze,mark为迷宫长宽均加二的矩阵 desr,desc为出口点 / void FindAllPath( Matrix& maze, Matrix& mark, int desr, int desc) {node first, last; first.row = 1; first.col = 1; last.row = desr; last.col = desc; IsReachable(maze, mark, first, last); path.clear(); }/ m迷宫矩阵数据 r,c行和列的大小 desr,desc目标位置 / void ShowAllPath(int m, int r, int c, int desr=-1, int desc=-1) {Matrix maze, mark; maze.Create(r+2, c+2); if (desr==-1 || desc==-1) {desr = r; desc = c; }int i, j; for (i=0;i {for (j=0;j {if (j==0 || j==c+1 || i==0 || i==r+1) {mark(i, j) = maze(i, j) = 1; }else{ mark(i, j) = 0; maze(i, j) = m[((i-1)c+j-1)]; }} }count = 0; FindAllPath(maze, mark, desr, desc); maze.Release(); mark.Release(); }#endif //main.cpp #include #include "Migong.h" using namespace std; int mg[]={ 0,0,1,0,0,0,1,0,//1 0,0,1,0,0,0,1,0,//2 0,0,0,0,1,1,0,1,//3 0,1,1,1,0,0,1,0,//4 0,0,0,1,0,0,0,0,//5 0,1,0,0,0,0,0,1,//6 0,1,1,1,1,0,0,1,//7 1,1,0,0,0,1,0,1,//8 1,1,0,0,0,0,0,0,//9 }; void main() {Migong m; m.Create(mg, 9, 8); m.OutputMaze(); m.Solve(); m.ShowSolve(); ShowAllPath(mg,9,8,9,8); }2.任意两点的最短路 class Matrix {bool IsCreated; int data; int row; public: Matrix(){IsCreated = false;row = 0; col = 0; data = 0;}; ~Matrix(){if (data!=0) delete [] data;}; bool Create(int r, int c, int n); int& operator () (int r, int c); }; bool Matrix::Create(int r, int c, int n = 0) {if ( IsCreated) return false; if ( (row = r) <=0 || (col = c) <=0) return false; data = new int[rowcol]; int i,j; for (j=0;j data[icol+j] = n; IsCreated = true; }int& Matrix::operator()(int r, int c) }jingdian//Matrix类,存储点 dist//Matrix类,存储任意两点间的距离 MAX_DIST//一个大数,大于任意两点间的距离,当两点间没有路的时候设为它 bestdist//Matrix类,存储任意两点的最近距离 bestpath//Matrix类,i到j的最短路为i.......bestpath(i,bestpath(i,pbestpath(i,j))), bestpath(i,pbestpath(i,j)), j bestpath(i,j)表示i到j的最短路中j的前一个结点号 void GetBestPath() {int n = jingdian.size(); int i, j, k; bestdist.Create(n, n); bestpath.Create(n, n); for (i=0;i for (j=0;j {if ( (bestdist(i,j) = dist(i,j)) == -1) bestdist(i,j) = MAX_DIST; if ( i!=j && bestdist(i,j) bestpath(i,j) = i; else bestpath(i,j) = -1; }for (k=0;k for (i=0;i for (j=0;j if (bestdist(i,k)+bestdist(k,j) < bestdist(i,j)) {bestdist(i,j) = bestdist(i,k)+bestdist(k,j); bestpath(i,j) = bestpath(k,j); }} 这个代码太多,明显是不会看的节奏,但是我可以}void main()给出我的一个简化的方案或者说是一个思路 首先这明显是个搜索题: 我到了一个迷宫的一个点 它有上下左右四个方向可以去走吧, 所以简便方法 ::先定义int x[4] ={0, 0, -1, +1}; int y[4]={1, -1, 0, 0}; 我走迷宫肯定要标记的吧,不然我来回走不是永远也走不玩么; 所以我定义一个数组 int is_walk_by[row][colum]; 3.然后我25.面试知识开始走了 bool zoulu( int a, int b){ //判断走对了的方法,再来个剪枝 主体 xx= a+x[i]; yy= b+x[i]; mark[xx][yy]=1;//设已经走过 if(zoulu(xx, yy)){ }else { mark[xx][yy]=0;//还原 return false; }} //这好像是个递归深搜的方法,看看对你有没有用吧,没用当我没说 “->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。 换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。 问题中的p=p->next ,意思是将p指向的一个结构体实例中的自数据next赋值给p。 扩展资料: 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。 定义与声明: 结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。 ->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”. 举个例子: struct Data {int a,b,c; }; /定义结构体/ struct Data p;/定义结构体指针/ struct Data A = {1,2,3};/声明变量A/ int x;/声明一个变量x/ p = &A ; /让p指向A/ x = p->a;/这句话的意思就是取出p所指向的结构体中包含的数据项a赋值给x/ /由于此时p指向A,因而 p->a == A.a,也就是1/ 对于一开始的问题 p = p->next;这应该出现在C语言的链表,这里的next应该是一个与p同类型的结构体指针,其定义格式应该是: struct Data {int a; struct Data next; };/定义结构体/ ………… main() …… p = p->next;/将next中的值赋给p/ }链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。 什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。 那结构体呢?结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿找到了栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的(p = p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。现在你能明白 p=p->next的含义了吧! 写了这么多。希望你能明白。 如果想学好c和C++,链表和指针必须熟练掌握! ->是一个整体,代表“指向”的意思。 例如有定义 struct {int b; struct next; }c,d,p; 在上面的定义中,c和d是变量,它们的类型是,p是一个指向类型的指针变量。 p=&c; 则把变量c的地址赋给p,search_map(a,point_x-1,point_y);此时,p指向c。 p->next=d; 则d就是c的后继,此时p指向c,p->指向d, p=p->next ; 则p就指向了d ->是一个整体,表示从指针访问结构体的成员变量 p = p->next 这常常用于结构体单链表,表示p指向下一个 ->是一个整体,它是用于指向结构体、C++中的class等含有子数据的指针用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”. struct Data p;/声明指针变量p/ …… p = p->next;/将next中的值赋给p/ ->运算是间接寻址,你用多指针的话会发现指针用->这种调用方式更简洁 链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。 什么是变量?所谓变量,不要浅显的认为会变得量就是变量。举个例子:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但是C语言的指针,就是这个房间的地址。我们声明变量就相当于盖了间房子存放东西,我们可以直接观看房子里的东西,而声明指针,就是相当于获得了一个,当用指针指向某个变量时,就是用指针给变量定位,以后我们就可以用指针找到他所“跟踪”的变量并可以获得里面的内容。 至于我们写代码的结构体就相当于是有好几个房子组成的别墅,几个房子绑定在一起使用。设现在有很多这种别墅分布在一个大迷宫里,每间别墅里都有一间房子。里面放了另一个别墅的位置信息,现在你手拿找到了栋别墅,从里面得到了你想要的东西(链表的数据部分),然后把下一栋别墅的位置计入你的(p =p->next),再走向下一栋别墅……如此走下去,知道走到某地下一栋别墅信息没有了(p->next == NULL),你的旅行结束。这就是链表一次遍历的过程。 aTdPage[ucTdPageIndex]->OnInit ();就相当于一个 叫问号表达式 原型: 表达式1 ? 表达式2 : 表达式3 意思判断表达式1否真真则执行表达式2否则执行表达式3 例: max = (a > b ? a : b); 句意思ab较数赋值给max ->就是一个整体,p=p->next表示一个结构体变量p的成员next p->next就是p结点的下一个结点的指针。 #include #include #include struct stack {int v; int i; int j; }s[1024]; void getmaze(int,int); int takelmaze(int,int); void push(int,int,int); int maze[1024][1024]; bool mark[1024][1024]; int top; {int n,m; printf("请输入迷宫的大小?(n,m)n"); scanf("%d%d",&n,&m); getmaze(n,m); if(takelmaze(n,m)) output(n,m); printf("输入回车离开程序。"); fflush(stdin); while(getchar()!='n'); return 0; }int takelmaze(int n,int m) {int v; int g,h; int move[9][2]={{0,0},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}}; v=1; g=1; top=0; memset(mark,0,sizeof(mark)); mark[1][1]=1; do{ g=move[v][0]+g; h=move[v][1]+h; if(g==n&&h==m&&maze[n][m]==0) return 1; if((maze[g][h]==0)&&(mark[g][h]==0)) {mark[g][h]=1; push(g,h,v); v=1; }else if(v<8) {g=-move[v][0]+g; h=-move[v][1]+h; v++; }else {if(top>0) {g=s[--top].i; h=s[--top].j; v=s[--top].v; v++; }} }while((top>=0)&&(v!=8)); printf("此迷宫无解n"); return 0; }void getmaze(int n,int m) {int a,b; for(a=0;a<=n+1;a++) {maze[a][0]=1; maze[a][m+1]=1; }for(b=0;b<=m+1;b++) maze[n+1][b]=1; }for(a=1;a<=n;a++) {for(b=1;b<=m;b++) scanf("%d",&maze[a][b]); }return; }void push(int i,int j,int v) {s[top].i=i; s[top].j=j; s[top].v=v; top++; return;cout< }void output(int n,int m) {int i=0; printf("(1,1)->"); while(i printf("(%d,%d)-〉",s[i].i,s[i++].j); return; } #include #include #include #include using namespace std; char a[100e.di++;//换下一个方向探索000][010000]; int u[5]={0,1,0,-1,0}, int b[100000],c[100000],p[100000],x,y,s=0,h,t,sx,sy; void out(int d) {s++; if(p[d]!=0)out(p[d]); return; }int main() {int n,m;h=0;t=1; cin>>n>>m; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) {c12.2.存储类型划分in>>a[i][j]; if(a[i][j]=='S') {b[t]=i;c[t]=j;a[i][j]='#'; }if(a[i][j]=='T') }} while(h!=t) {h++; for(int i=1;i<=4;++i) {x=b[h]+u[i];y=c[h]+w[i]; if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!='#') {t++; b[t]=x;c[t]=y;p[t]=h;a[x][y]='#'; if(x==sx&&y==sy) {out(t); cout< }} }} } 如果你学过,用bfs,如果没学过,学习一下,你就会了,如果单要,╯﹏╰,伸手很令人的 1、可以用“”来代表老鼠,“|”来代表墙,空格来代表路。每走一步用("cls")刷新一次屏幕//////作者:baihacker/////。 2、墙不可穿过代表,墙与周围的格子没有边。 3、规定一个时间t,若在t步之内没有走到粮仓,则输出无解。 4、这个简单,无非就是修改条件,从而修改整{return data[rcol+c];个图。 5、所用路径可以用深搜(回朔)来解决,最短路就用广搜来解决。最短路也可以用Dijstra算法、floyd算法等,但广搜是最简单的。 具体的程序你自己实现吧,如果写不出来,就去请教一下你们学校的ACMer,他们应该会比较熟悉。加油吧。 请问你还保存着吗? #include #include #include #include #include using namespace std; typedef struct {int x; int y; }Pos; const int height=25; const int weight=25; stack bool MazePath(int map[height][weight],int m,int n); int map[25][25]; int z1, z2; void printmap(); void makemap(); void makeway(int,int); int searchPath(int, int); {for(int i=0; i<=23 ;++i) for(int j=0; j<=23; ++j) map[i][j] = 1; makemap(); cout << "典型的迷宫测试" < if (!MazePath(map,0,0)) {cout<<"无路可走"< return 0; }Pos p; while(!s.empty()) {}makeway(10,4); makeway(10,5); printmap(); ("pause"); return 0; }bool MazePath(int map[height][weight],int m,int n) {Pos p={m,n}; s.push(p); if (map[m][n]==-2) else if (map[m][n]==1||map[m][n]==2) {s.pop(); return false; }else if(map[m][n]==0) map[m][n]=2; if (n+1 if (m+1 if (n-1>=0&&MazePath(map,m,n-1)) if(m-1>=0&&MazePath(map,m-1,n)) s.pop(); return false; }void printmap() {for(z2=1; z2<=23; z2++) {for(z1=1;z1printf("(%d,%d)",n,m);<=23;z1++) { switch(map[z2][z1]) {case -1:cout<<"入"; break; case -2:cout<<"出"; break; case 0:cout<<" "; break; case 1:cout<<"■"; break; case 2:cout<<"XX"; break; break; case 4{struct Data p;/声明指针变量p/:cout<<"②"; break; case 5:cout<<"①"; break; }} }cout << endl; }void makemap() {for(z1=0, z2=24; z1<=24; ++z1) {map[z1][0] = 0; map[z1][z2] = 0; }for(z1=0, z2=24; z1<=24; ++z1) {map[0][z1] = 0; map[z2][z1] = 0; }map[2][1] = -1; map[22][23] = -2; srand((unsigned)time(NULL)); searchPath(rand()%11+1, rand()%11+1); }int searchPath(int x, int y) {static int dir[4][2] = {0, 1, 1, 0, 0, -1, -1, 0}; int zx = x2; int zy = y2; int next, turn, i; map[zx][zy] = 0; turn = rand()%2 ? 1 : 3; for(i=0, next=rand()%4; i<4; ++i, next=(next+turn)%4) if(map[zx+2dir[next][0]][zy+2dir[next][1]] == 1) {map[zx+dir[next][0]][zy+dir[next][1]] = 0; searchPath(x+dir[next][0], y+dir[next][1]); }return 0; }void makeway(int count,int a) {int hcout=0; while (hcout {z1=rand()%21+2; z2=rand()%21+2; if (map[z1][z2+1]!=a&&map[z1][z2+1]!=a&&map[z1+1][z2]!=a&&map[z1-1][z2]!=a&&map[z1][z2]!=3) {map[z1][z2]=a; hcout++; }} }/本迷宫 地图每次都是随机生成,且生成图形每次都不一样,在生成的基础上,加上了自动寻路功能。电脑的思维方式体现在了迷宫的路径上。电脑走过的正确的道路用龘表示,错误的道路用XX表示。没有走过的道路为空白的。其中①和②为各类陷阱,本迷宫只有一条出路~/ 这个是我大一时候做的设计,现在可能忘记很多了,我是直接般过来的。当初我做了3天!关于C语言的问题,高手进
case 3:cout<<"龘";c语言迷宫小游戏,10乘10大小的迷宫,我拿别人的代码修改的,为什么结果总是显示找不到路径,代码如下
k=0;C语言中->是什么意思啊?
{printpath(s);c语言程序设计 迷宫问题
C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern) ;C/C++语言 “走出迷宫”
注:数据结构 c语言 课程设计 小鼠走迷宫问题
{sx=i;sy=j;本人大一,急需大神指导,怎样用C语言做一个简单的迷宫,就是用和空格表示的那种,急求!!!
cur=NextPos(e.seat,e.di);//设定当前位置是该
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系 836084111@qq.com 删除。