• 数据结构-迷宫


    // 迷宫问题.cpp : 定义控制台应用程序的入口点。
    #include "stdafx.h"
    #define M 4
    #define N 4
    #define MaxSize 100
    int  mg[M + 2][N + 2] = {
    	{1,1,1,1,1,1},
    	{1,0,0,0,0,1},
    	{1,0,1,0,0,1},
    	{1,1,0,1,0,1},
    	{1,0,0,0,0,1},
    	{1,1,1,1,1,1}
    };
    
    struct 
    {
       int i;int  j; int di;
    }Stack[MaxSize],Path[MaxSize]; // 定义栈和最短路径的数组
    
    // 初始化
    int top = -1;
    int count = 1;
    int minlen = MaxSize;
    
    void mgpath()
    {
    	int i, j, di, find, k;
    	top++;
    	Stack[top].i = 1;
    	Stack[top].j = 1;
    	Stack[top].di = -1;
    	mg[1][1] = -1;
    
    	//所有方向走完,回到初始点,退出栈,站内为空 
    	while (top>-1)
    	{
    		i = Stack[top].i;
    		j = Stack[top].j;
    		di = Stack[top].di;
    
    		// 走出迷宫,打印当前路线信息,比较路径长度,找出最短路径。
    		if (i == M && j == N)
    		{
    			printf_s("%4d:", count++);
    			for (k = 0; k <= top; k++)
    			{
    				printf_s("(%d,%d) ", Stack[k].i, Stack[k].j);
    				if ((k + 1) % 5 == 0)
    				{
    					printf_s("
    	");
    				}
    			}
    			printf_s("
    ");
    			if (top + 1 < minlen)
    			{
    				for (k = 0; k <= top; k++)
    				{
    					Path[k] = Stack[k];
    				}
    				minlen = top + 1;
    			}
    
    
    			// 开始回溯路径,寻找其他路径
    			mg[Stack[top].i][Stack[top].j] = 0;
    			top--;
    			i = Stack[top].i;
    			j = Stack[top].j;
    			di = Stack[top].di;
    		}
    
    		find = 0;
    		while (di<4&&find==0)
    		{
    			di++;
    			// 迷宫方向选择(上、右、下、左)
    			switch (di)
    			{
    			case 0:  // 向上
    				i = Stack[top].i - 1;
    				j = Stack[top].j;
    				break;
    			case 1:	// 向右
    				i = Stack[top].i;
    				j = Stack[top].j + 1;
    				break;
    			case 2: // 向下
    				i = Stack[top].i + 1;
    				j = Stack[top].j;
    				break;
    			case 3: // 向左
    				i = Stack[top].i;
    				j = Stack[top].j - 1;
    				break;
    			}
    			if (mg[i][j] == 0)
    			{
    				find = 1;	
    			}
    		}
    
    		if (find == 1)				// 找到下一个可走节点
    		{
    			Stack[top].di = di;		// 更改原栈顶元素的方向di值,小于di方向已走,大于di方向未走。
    			top++;                  // 可走节点入栈,
    			Stack[top].i = i;
    			Stack[top].j = j;
    			Stack[top].di = -1;     // 可走节点方向从-1开始到3进行判断下一个可走节点
    			mg[i][j] = -1;			//避免重复走到节点
    		}
    		else                        // 没有路径可走,则退栈(所有信息下次入栈时重新初始化)
    		{
    			mg[Stack[top].i][Stack[top].j] = 0;			//最后初始节点所有方向走完,无可走节点,退栈,栈空 
    			top--;
    		}
    	}
    
    	// 打印迷宫最短路径。
    	if (minlen >= MaxSize)
    	{
    		printf_s("迷宫没有出口:
    ");
    	}
    	else
    	{
    		printf_s("最短路径如下:
    ");
    		printf_s("长度:%d 
    ", minlen);
    		for (k = 0; k < minlen; k++)
    		{
    			printf_s("(%d,%d)", Path[k].i, Path[k].j);
    			if ((k + 1) % 5 == 0)
    			{
    				printf_s("
    	");
    			}
    		}
    	}
    }
    
    int main()
    {
       
    	int i=0;
    	mgpath();
    	scanf_s("%d", i);
    	return 0;
    }
    

      

  • 相关阅读:
    jQuery Timer 实现的新邮件提醒
    在 jquery repeater 中添加设置日期,下拉,复选框等控件
    jquery repeater 完成 QQ 邮箱邮件分组显示功能
    Ajax 与 WebService 之间日期等数据类型的转换
    通过 Parameter 对象添加 Ajax 请求时的参数
    在 jQuery Repeater 进行验证更新等操作时提示消息
    jquery repeater 模仿 Google 展开页面预览子视图
    在 jQuery Repeater 中检索过滤数据
    功能完善的 jquery validator 完成用户注册的验证
    在 Repeater 中绑定转化 JSON 格式的字段
  • 原文地址:https://www.cnblogs.com/tuqunfu/p/7545769.html
Copyright © 2020-2023  润新知