zoukankan      html  css  js  c++  java
  • 数据结构-迷宫

    // 迷宫问题.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;
    }
    

      

  • 相关阅读:
    嵌套查询别名必须性示例。HAVING用法
    分组查询限制。HAVING可写在GROUP BY前。
    合并查询结果集UNION(去重), UNION ALL(不去重),INTERSECT(交集),MINUS(差集,第一个结果集减去第二个结果集,第一个结果集中不在第二个结果集中的记录行),[NOT] EXIST
    18-matlab知识点复习一
    53-java中的queue
    52-2018 蓝桥杯省赛 B 组模拟赛(一)java
    51-迷宫(一)- java版dfs和bfs
    50-2018 蓝桥杯省赛 B 组模拟赛(五)
    49-2015年第6届蓝桥杯Java B组
    46-web页面登入前和登入后控制
  • 原文地址:https://www.cnblogs.com/tuqunfu/p/7545769.html
Copyright © 2011-2022 走看看