c语言的迷宫问题

以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。基本要求:首先实现一个以... 以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。迷宫问题要求求出从入口(1,1)到出口(m,n)的一条通路,或得出没有通路的结论。
基本要求:
首先实现一个以链表作存储结构的栈类型,然后编写一个求迷宫问题的非递归程序,求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标, d表示走到下一坐标的方向。
测试数据:
左上角(1,1)为入口,右下角(m,n)为出口。
选作内容:
(1)编写递归形式的算法,求得迷宫中的所有可能的通路;
(2)以方阵的形式输出迷宫及其通路迷宫中的所有可能的通路;
展开
 我来答
百度网友2018359
2018-06-24 · TA获得超过3494个赞
知道大有可为答主
回答量:3486
采纳率:73%
帮助的人:1397万
展开全部
//寻路_带权重_带障碍_最短_文件地图_不闪------wlfryq------//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

typedef struct
{
int x;
int y;
} _PT;

_PT pt;
int row=0,col=0;

//设置CMD窗口光标位置
void setxy(int x, int y)
{
   COORD coord = {x, y};
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
//获取当前CMD当前光标所在位置
void getxy()
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coordScreen = {0, 0}; //光标位置
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hConsole, &csbi))
    {
     pt.x=csbi.dwCursorPosition.X;
     pt.y=csbi.dwCursorPosition.Y;
    }
}

typedef struct
{
int x;
int y;
int type;
int v;
}PT;

PT **s=NULL,stack[50],start,end,c;
int pos=0;

void prt()
{
int i,j;
system("cls");
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(s[i][j].type==1)
{
printf("■");
}
else if(i==end.x && j==end.y)
{
printf("★");
}
else if(i==c.x && j==c.y)
{
printf("◎");
}
else
{
printf("  ");
}
}
printf("\n");
}
Sleep(500);
}

void stack_in(PT a)
{
stack[pos++]=a;
}

PT stack_out()
{
int i;
PT t;
t=stack[0];
for(i=0;i<pos-1;i++)
{
stack[i]=stack[i+1];
}
pos--;
return t;
}

void fun()
{
PT a;
int x,y,v;
while(1)
{
if(pos==0)
{
break;
}
a=stack_out();
x=a.x;
y=a.y;
if(x==start.x && y==start.y)
{
break;
}
v=s[x][y].v;
if(x-1>=0 && s[x-1][y].type==0 && (s[x-1][y].v==-1 || s[x-1][y].v>v+1))
{
s[x-1][y].v=v+1;
stack_in(s[x-1][y]);
}
if(x+1<=row-1 && s[x+1][y].type==0 && (s[x+1][y].v==-1 || s[x-1][y].v>v+1))
{
s[x+1][y].v=v+1;
stack_in(s[x+1][y]);
}
if(y-1>=0 && s[x][y-1].type==0 && (s[x][y-1].v==-1 || s[x-1][y].v>v+1))
{
s[x][y-1].v=v+1;
stack_in(s[x][y-1]);
}
if(y+1<=col-1 && s[x][y+1].type==0 && (s[x][y+1].v==-1 || s[x-1][y].v>v+1))
{
s[x][y+1].v=v+1;
stack_in(s[x][y+1]);
}
}
}

void go(int x, int y)
{
printf("\n按任意键开始\n");
getchar();
int v;
while(1)
{
if(x==end.x && y==end.y)
{
setxy(0,y+2);
printf("end....");
return;
}
v=s[x][y].v;
if(v==0)
{
return;
}
if(x-1>=0 && s[x-1][y].v==v-1)
{
c=s[x-1][y];
setxy(y*2,x);
x=x-1;
printf("  ");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else if(x+1<=row-1 && s[x+1][y].v==v-1)
{
c=s[x+1][y];
setxy(y*2,x);
x++;
printf("  ");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else if(y-1>=0 && s[x][y-1].v==v-1)
{
c=s[x][y-1];
setxy(y*2,x);
y--;
printf("  ");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
else if(y+1<=col-1 && s[x][y+1].v==v-1)
{
c=s[x][y+1];
setxy(y*2,x);
y++;
printf("  ");
setxy(y*2,x);
printf("◎");
Sleep(500);
continue;
}
}
printf("\nreturn go\n");
system("pause");
}

void GetMapFromFile()
{
int i,j,x,y,len;
char ch[50]={'\0'};
FILE* fp=fopen("e:\\map1.txt","r");
if(fp==NULL)
{
printf("open file failed.\n");
return;
}
x=0;

while(!feof(fp))
{
fgets(ch,50,fp);
row++;
}
col=strlen(ch);
fseek(fp,0L,SEEK_SET);
while(!feof(fp))
{
fgets(ch,50,fp);
if(s==NULL)
{
len=strlen(ch);
for(i=len-1;i>0;i--)
{
if(ch[i]!='0' && ch[i]!='1')
{
ch[i]='\0';
}
else
{
break;
}
}
len=strlen(ch);
s=(PT**)malloc(sizeof(PT*)*row);
for(j=0;j<len;j++)
{
*(s+j)=(PT*)malloc(sizeof(PT)*len);
}
}
y=0;
for(i=0;i<len;i++)
{
s[x][y].type=ch[i]-48;
s[x][y].x=x;
s[x][y].y=y;
s[x][y].v=-1;
y++;
}
x++;
}
start=s[row-2][1];
end=s[row-2][len-2];
fclose(fp);
}

int main()
{
GetMapFromFile();
int i,j;
int x,y;
x=end.x;
y=end.y;
s[x][y].v=0;
stack_in(end);
fun();
c=start;
prt();
go(start.x,start.y);
return 0;
}
追问

请问为什么代码复制后用dev c++运行显示打开失败

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式