• 一个搜索迷宫出路的程序


    /*1.定义一个结构体position
        结构体中包括一个方块的行列号和下一个
        可走方块的方位号
    2.定义一个结构体。
        包括一个一个position结构体,一个栈顶指针
    3.定义入栈,出栈,取栈顶函数
    4.定义迷宫,
        0:不通
        1:通路
        -1:已经走过的路,每次入栈后将位置改为-1,表示已经走过
        默认最外围是墙,(1.1)是入口,(ROW-2.COL-2)是出口
    5.解迷宫:
        1)入口进栈。
        2)进入while循环,结束条件为栈空
            {
            推断当前位置是否为出口,是。打印路径,结束
            不是,依照上。右。下,左的顺序试探,通路则入栈,
            并记录该路径的方位号
            假设4路都不通。将该位置标示为-1。在以后的试探中不会再走此路
            }
    6.画图工具的坐标:X 轴向右为正(行即ROW),Y 轴向下为正(列即COL)
    	每入栈一个位置,涂一次色。出栈后涂还有一种色
    */
    #include <iostream>
    #include <time.h>
    #include<cstdio>
    #include <graphics.h>
    #include<conio.h>
    using namespace std;
    #define Row 15
    #define Col 16
    #define MaxSize Row*Col
    typedef struct
    {
    	int i;
    	int j;
    	int nextNum;
    }position;
    
    typedef struct
    {
    	position data[MaxSize];
    	int top;
    }MyType;
    MyType P;
    
    void push(position e)//入栈
    {
    	P.top++;
        P.data[P.top].i=e.i;
    	P.data[P.top].j=e.j;
    	P.data[P.top].nextNum=e.nextNum;
    }
    void pop(position &e)//出栈
    {
    	e.i=P.data[P.top].i;
    	e.j=P.data[P.top].j;
    	e.nextNum=P.data[P.top].nextNum;
    	P.top--;
    }
    int GetTop()//取栈顶指针
    {
    	return P.top;
    }
    
    int main()
    {
    
    
    	P.top=-1;
    	int mp[Row][Col]={0};//初始化地图每一个方格
         int x,y,k;
        initgraph(Col*40+100,Row*40+80);//初始化图形
    	setbkcolor(LIGHTCYAN);
    	cleardevice();
    	for(int i=0;i<Row+1;i++)							//画横线
    	{
    		setcolor(BLACK);								
    		line(50,50+40*i,50+Col*40,50+40*i);
    	}
    	for(int j=0;j<Col+1;j++)							//画竖线
    	{
    		setcolor(BLACK);								
    		line(50+40*j,50,50+40*j,50+Row*40);
    	}
    srand((unsigned)time(NULL));//生成随机种子
        for(x=1; x<Row-1; x++)
        {
            //生成迷宫
            for(y=1; y<Col-1; y++)
            {
                k = rand()%3;//控制通路占2/3。障碍占1/3;
                if(k<1)
                    mp[x][y] = 0;
                else
                    mp[x][y] = 1;
            }
        }
        mp[1][1]=1;
        mp[Row-2][Col-2]=1;
    for(x=0;x<Row;x++)
    	{
    		for(y=0;y<Col;y++)
    		{
    		
    			if(mp[x][y]==0)								//障碍涂红色
    			{
    		     	setfillcolor(RED);
    				floodfill(60+40*y,60+40*x,BLACK);
    			}	
                     
    		}
    	}
    
     setfillcolor(BLACK);
     floodfill(0,0,BLACK);
    
    //開始入栈
     P.top++;
     P.data[P.top].i=1;
     P.data[P.top].j=1;
     P.data[P.top].nextNum=0;
      mp[1][1]=-1;
      //第一步涂成蓝色
    setfillcolor(BLUE);
    floodfill(100,100,BLACK);
    
    //Sx当前方块的x,Sy为当前方块的y,Sid为下一个可走方块的方位号
    	 int Sx=0,Sy=0,Sid=0,m=0;
    	  while(P.top>-1)
        {//进入循环试探
            Sx=P.data[P.top].i;			//取栈顶
            Sy=P.data[P.top].j;
            Sid=P.data[P.top].nextNum;
            if(Sx==Row-2&&Sy==Col-2)	//推断当前位置是否为出口
            {break;}
                int find =0;	//用于推断是否找到通路
    while(Sid<5&&find==0)							//循环试探四个方向是否有路
            {
                Sid++;
                switch(Sid)
                {
                case 4:
                    Sx=P.data[P.top].i-1;
                    Sy=P.data[P.top].j;
                    break;
                case 1:
                    Sx=P.data[P.top].i;
                    Sy=P.data[P.top].j+1;
                    break;
                case 2:
                    Sx=P.data[P.top].i+1;
                    Sy=P.data[P.top].j;
                    break;
                case 3:
                    Sx=P.data[P.top].i;
                    Sy=P.data[P.top].j-1;
                    break;
                }
                  if(mp[Sx][Sy]==1)		//找到通路
                    find=1;				//否则。继续找下一个
    	
    	}
    	  if(find==1)										//下一个方块可走。便入栈
            {
                P.data[P.top].nextNum=Sid;				//改动原来栈顶的next_id的值
                P.top++;									//入栈
                P.data[P.top].i=Sx;
                P.data[P.top].j=Sy;
                P.data[P.top].nextNum=0;				
             //入栈涂色
    			setfillcolor(BLUE);
    			floodfill(60+Sy*40,60+Sx*40,BLACK);
    				Sleep(100);
                mp[Sx][Sy]=-1;								//避免反复走到该块
    
    	  }
    	   else											//即四路都不通,标记为不可走 0,然后出栈
            {
    
                mp[P.data[P.top].i][P.data[P.top].j]=0;//将该处标记为不可走
    			setfillcolor(GREEN);//出栈涂色
    			
    			floodfill(60+P.data[P.top].j*40,60+P.data[P.top].i*40,BLACK);
    				Sleep(100);
    			P.top--;
    		
    			
            }
    }
    	  
    	if(P.top==-1)
    	{
    		settextcolor(RED);								
    		settextstyle(100,100,"宋体");
    		outtextxy(150,300,"失败");
    	}
    	else
    	{
    		settextcolor(RED);								
    		settextstyle(100,100,"宋体");
    		outtextxy(150,300,"胜利");
    	}
    getchar();	
    closegraph(); 
    	return 0;
    }

    执行 效果图


  • 相关阅读:
    反射
    java 验证码识别
    Spring boot + mybatis + orcale
    JVM内存模型及垃圾回收的研究总结
    Java的Array和ArrayList
    Java中最常见的十道面试题
    session和cookie
    Hibernate的load()和get()区别
    ajax跨域获取网站json数据
    对于Spring的IOc和DI的理解
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7392266.html
Copyright © 2020-2023  润新知