int-迷宫问题求用一个更好的办法代替两个栈

问题描述

迷宫问题求用一个更好的办法代替两个栈

#include
#include
#define M 20 //最大行数
#define N 20 //最大列数
struct mark //定义迷宫内点的坐标类型
{
int x; //行值
int y; //列值
};

struct Element //链栈元素结点
{
int x,y; //x行,y列
int d; //d下一步的方向
};

struct LStack //链栈
{
Element elem;
struct LStack *next; //指针变量
};

typedef LStack *PLStack;

/*……………………………栈函数……………………………*/

int InitStack(PLStack &S)//构造空栈
{
S=NULL;
return 1;
}

int StackEmpty(PLStack S)//判断栈是否为空
{
if(S==NULL)
return 1;
else
return 0;
}

int Push(PLStack &S, Element e)//压入新数据元素
{
PLStack p;
p=(PLStack)malloc(sizeof(LStack));
p->elem=e;
p->next=S;
S=p;
return 1;
}

int Pop(PLStack &S,Element &e) //栈顶元素出栈
{
PLStack p;
if(!StackEmpty(S))
{
e=S->elem;
p=S;
S=S->next;
free(p);
return 1;
}
else
return 0;
}

/*……………………求迷宫路径函数……………………………*/
void MazePath(struct mark start,struct mark end,int maze[M][N],int Direction[4][2])
{
int i,j,d;

int a,b;
Element elem,e;
PLStack S1, S2; //定义两个栈
InitStack(S1);
InitStack(S2);
maze[start.x][start.y]=2; //入口点作上标记
elem.x=start.x;
elem.y=start.y;
elem.d=-1; //开始为-1
Push(S1,elem);
while(!StackEmpty(S1)) //栈不为空 有路径可走
{

Pop(S1,elem);
i=elem.x; //入口横坐标
j=elem.y; //入口纵坐标
d=elem.d+1;//下一个方向
while(d<4) //试探各个方向
{
a=i+Direction[d][0];
b=j+Direction[d][1];

                   /*如果到了出口*/

if(a==end.x && b==end.y && maze[a][b]==0)
{
elem.x=i;
elem.y=j;
elem.d=d;

Push(S1,elem);//让出口前的最后一步进栈
elem.x=a;
elem.y=b;
elem.d=666; //方向输出为-1 判断是否到了出口
Push(S1,elem);
printf("n括号内第三位数字n0代表向右移动一格 1代表向下 2代表向左 3代表向上n666为则走出迷宫nn通路为:(行坐标,列坐标,方向)n");
while(S1) //逆置序列 并输出迷宫路径序列
{
Pop(S1,e);
Push(S2,e);
}
while(S2)
{
Pop(S2,e);
printf("-->(%d,%d,%d)",e.x,e.y,e.d);
}
return; //用break,出错,exit会结束程序,选用return
}

                /*找到可以前进的非出口的点*/

if(maze[a][b]==0)
{
maze[a][b]=2; //标记走过此点
elem.x=i;
elem.y=j;
elem.d=d;
Push(S1,elem); //当前位置入栈
i=a; //下一点转化为当前点
j=b;
d=-1;
}

d++;

}
}
printf("该路径中有断路,无法走出n");
}

                       /*建立迷宫*/

void initmaze(int maze[M][N])
{
int i,j;
int m,n; //迷宫行,列

printf("请输入迷宫的行数 m=n"); //输入迷宫
scanf("%d",&m);
printf("请输入迷宫的列数 n=n");
scanf("%d",&n);
printf("n请输入迷宫的各行各列:n用空格隔开,0代表路,1代表墙nn",m,n);
for(i=1;i<=m;i++)
{
printf("第%d行迷宫设置:",i);
for(j=1;j<=n;j++)
scanf("%d",&maze[i][j]);
}

printf("*************************所建立的迷宫为****************************n");
for(i=0;i<=m+1;i++) //加一圈坐标和围墙
{
maze[i][0]=i; //行坐标
maze[i][n+1]=1;
}
for(j=0;j<=n;j++)
{
maze[0][j]=j; //列坐标
maze[m+1][j]=1;
}

for(i=0;i<=m+1;i++) //输出迷宫
{
for(j=0;j<=n+1;j++)
printf("%d ",maze[i][j]);
printf("n");
}
}

void main()
{
printf("*****************漫步迷宫*******************n");

int sto[M][N];
struct mark start,end; //start,end入口和出口的坐标
int add[4][2]={{0,1},{1,0},{0,-1},{-1,0}};//行增量和列增量 方向依次为上下左右

initmaze(sto);//建立迷宫

printf("输入入口的横坐标,纵坐标[逗号隔开]n");
scanf("%d,%d",&start.x,&start.y);
printf("输入出口的横坐标,纵坐标[逗号隔开]n");
scanf("%d,%d",&end.x,&end.y);

MazePath(start,end,sto,add); //寻找路径
printf("n");
}

解决方案

你得栈可以使用双向链表或者数组,就可以使用一个栈

时间: 2024-09-15 21:07:55

int-迷宫问题求用一个更好的办法代替两个栈的相关文章

c语言-求问一个C语言字符指针的问题

问题描述 求问一个C语言字符指针的问题 #include void Initialize (char * a, char * b) { a[0] = 'T'; a[1] = 'h'; a[2] = 'i'; a[3] = 's'; a[4] = ' '; a[5] = 'i'; a[6] = 's'; a[7] = ' '; a[8] = 'A'; a[9] = ''; b = a; b[8] = 'B'; } #define ARRAY_SIZE 10 char a[ARRAY_SIZE];

dp-动态规划(DP)算法求出一个问题的所有解

问题描述 动态规划(DP)算法求出一个问题的所有解 具体问题是: 假设有一个楼梯共有N步,你每次可以爬1步或2步.请编写一个函数来计算,有多少种不同的方法可以爬到顶. 此题给出的解如下: int climbStaris(int n){ if(n <= 1) return 1; if(n == 2) return 2; int p = 1, q = 2, curr; for( int i = 3; i <= n; ++i){ curr = p + q; p = q; q = curr; } re

代码-急求,一个课程设计作业,最近要去考G,实在没空做

问题描述 急求,一个课程设计作业,最近要去考G,实在没空做 1000C 简单SQL数据定义语言DDL的解释器实现 1.问题理解和分析(简单分析)针对一个需求比较明确的问题,进行问题定义.明确"做什么(What to do?)".2.确定解决问题的方法(技术方案.简单设计)主要是构思解决问题的主要思路,明确"怎么做(How to do?)".采用自顶向下方法,确定各个功能,用模块图描述系统的功能.确定各个功能对应的函数,以及函数之间的关系并能用流程图描述函数的算法.3

各位大神,求问一个leetcode的问题

问题描述 各位大神,求问一个leetcode的问题 我编写leetcode的第89题gray code, 发现我自己电脑编译出的结果和网页的编译结果不同,甚是蛋疼!原码如下:class Solution {public: vector grayCode(int n) { if (n ==0 ){ vector outcomes; outcomes.push_back(0); return outcomes; } else if (n == 1) { vector outcome; outcome

图片-初学小女子求问一个关于矩阵,中值滤波题目

问题描述 初学小女子求问一个关于矩阵,中值滤波题目 目前用的是VS2010,所以希望是C语言~多谢喇 望各方大神快快冒泡,解小女子一惑o(^▽^)o 解决方案 不是告诉你算法了么?就是用某个点周围8个点按照第二个矩阵的泉重求平均数,作为滤波后的值. 解决方案二: 打个比方,第二排第二个元素158,滤波以后等于多少呢? 我们看它和它四周的9个元素,是不是 160 163 167 159 158 155 153 155 157 和Mask每一项相乘相加再除以16 等于 (160*1+163*2+16

算法研究:已知不重复的int集合,求最长递增子序列

问题背景:最近换工作面试,面试官问了一道编程题,大体是已知不重复的int集合,求最长递增子集合,这个集合可以不是连续的,但顺序呢不能乱. 比如说:{2, 7, 3, 13, 6, 8}里最长递增子集合的就是{2,3,6,8}. 这道题感觉很有意思,于是回家就用代码实现了一遍. 主要代码: package com.galaxy.fym.algorithm.maxsublist; import org.apache.commons.collections.CollectionUtils; impor

求帮助一个java地铁换乘问题

问题描述 求帮助一个java地铁换乘问题 求帮助一个java地铁换乘问题,我想做一个有关地铁线路换乘的java应用程序,地铁换乘以广州为例.PS可以说明一下制作过程的想法和方法 希望大神可以给我一个完整的代码啊, 解决方案 看不懂 啥意思 地铁换乘咋了? 解决方案二: 假设你从M点到N点 你要定义出 1, 2, 3, 4 这四条地铁线上的所有站,可以用枚举,添加上对应的名称. 首先 你要判断M N 是否在同一条线上,如果在可以直接输出结果,如果不在找到第一换乘站, 获取这个换乘站上的另一条线路,

jdbc查询数据库的方法-jdbc中数据库查询我的那个方法更好?有更好的办法吗?求大神指点

问题描述 jdbc中数据库查询我的那个方法更好?有更好的办法吗?求大神指点 /* 查询数据库表t1中的数据/public void select() { //连接数据库 getDBCconnect(); try { //sql语句 String sql=""select * from t1 where id=1""; //创建要执行sql语句的对象 sta= con.createStatement(); //执行sql语句并将得到的结果放到结果集中 ResultSe

问题求助 数据结构-使用双栈实现中缀表达式求值一个字符栈一个数字栈

问题描述 使用双栈实现中缀表达式求值一个字符栈一个数字栈 程序写好没输出啊,急求啊......主要BUG 在Nibolansuanfa()这个自定义函数里面前面的可以忽略..... /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='')