此代码是关于我们这学期专业课的实验作业,本来按理说我不想写任意的,但是当时以为这个挺简单就跟老师说要写任意行列的,然后作大死的写了一周,爆肝了两天
注:本次代码关于栈的借助了网上某大佬的成果,但是我现在也找不到那位大佬的博客了因此无法注明,如果大佬看到这篇文章希望不要误会!!请联系我我马上给你加上引用来源~
首先讲一下,实验题目:
已知一个6×8的迷宫,利用堆栈求出并显示一条通路;若通路不存在,则显示无通路;迷宫矩阵的数据保存在一个文本文件中,相邻数据用空白符分隔。程序执行时,迷宫数据文件标识符从键盘输入。
执行界面如下(结果因迷宫不同而不同):
请输入迷宫矩阵文件标识符
F:\MG1.TXT
(1,1)->(2,2)->(3,3)->(3,4)->(3,5)->(3,6)->(4,5)->(5,6)->(5,7)->(5,8)->(6,8)
要求:
(1) 程序文件名为P1.C,上传该程序文件。
(2)上传运行结果界面截图。
为方便同学们调试程序,本实验提供了5个文本文件,其中MG1.TXT和MG2.TXT都是6×8的迷宫数据文件,其余3个 都是任意迷宫数据文件。
关于本次作业的难点:
由于我寄几是个小辣鸡所以我的难点也许对其他大佬都不值一提,所以这个难点只是针对我个人哦,请勿上升人身攻击博主智商条件(づ ̄3 ̄)づ╭❤~
讲一下思路
因为个人原因C语言C+都不是很熟练,但是相对而言,C还是要好点点,因此就选择了C来写,虽然被建议说C写数据结构很难建议用C+,但是当时已经差不多收尾了,遂未采纳
(1)首先先利用堆栈完成固定(宏定义)行列的迷宫问题求解
这种代码网上很多,我就不详细说明了,随便搜一下就行,我的这个代码也是网上搜的(呃呃呃(⊙﹏⊙))
(2)在(1)的基础上修改,利用文件读取获取文件的行列数
此处为了使函数可读性更强以及后期的修改优化,采用了函数的方式,模块化这一功能
int Lcolume()
{
char name[100];
char buf[1000];
int num=0;
FILE *fp;
puts("请输入迷宫矩阵文件标识符:");
gets(filename);
fp=fopen(filename ,"r");
if (!fp) // 判断是否打开成功
return -1;
while(!feof(fp))
{
fgetc(fp)&&num++;
}
rewind(fp);
while (fgets(buf, 1000, fp)) // fgets循环读专取,直到文件最后,才会返回属NULL
{
lineCnt++;
} // 累计行数
co=num/(2*lineCnt);
fclose(fp);
}
注:
/1/ fgetc()是一种计算机C语言中的函数。意为从文件指针stream指向的文件中读取一个字符,读取一个字节后,光标位置后移一个字节。格式:int fgetc(FILE *stream);里是引用
/2/ fgets函数功能为从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。
这里当时不小心踩了个坑,就是想在一个程序里进行两个while循环读取行数和字符个数,但是第二个循环给出的结果总是0,百思不得其解,后面求助某大佬,被告知,第一个循环结束之后,文件指针随即移到了文件最后一个字符,因此第二次循环读取时,要让指针指回文件开头,调用了rewind函数(此处特别鸣谢wxl、cxl童鞋给予了本次程序许多帮助,虽然两位可能也看不到这篇文章hhh)
因为读取的行列数和文件名之后会在主函数用到,因此把这三个变量都定义成了全局变量
(3)动态分配数组空间,用来存储迷宫坐标
(4)将文件读取的行列数传给数组(利用全局变量),实现了数组的动态化
Lcolume();
int t,r;
m=lineCnt;
n=co;
if(m <= 0 || n <= 0)
return -1; //行数或列数非法。
maze = (int **) malloc(sizeof(int *) *m);//申请一组一维指针空间。
for(t = 0; t < m; t ++)
maze[t] = (int *)malloc(sizeof