国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

以下算法均是原創(chuàng),未參考任何資料!請勿抄襲!歡迎交流。

親測可行:

使用藍橋杯比賽編譯器:DEV C++?

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題


求迷宮中從入口到出口的路徑是一個經(jīng)典的程序設(shè)計問題,通常采用“窮舉求解”的方法,即順著某一方向向前探索,若能走通,則繼續(xù)往前走;否則原路返回,換一個方向繼續(xù)探索,直至所有可能的通路都探索到為止。

因此,在求解迷宮問題的時候應(yīng)用“”也就是自然而然的事了。

對于程序來說:

1.我們需要規(guī)定一個方向作為主方向,使得“自己”的位置不斷移動,直到“遇到走不通的地方”或者是“遇到之前走過的地方”。

方向定義:

東:1

南:2

西:3

北:4

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

2.我們需要直到我們經(jīng)過哪些地方,在這里我們將除棧頂外的其他元素視為“經(jīng)過的地方”?。。?/span>

3.我們需要一個二維數(shù)組存放“迷宮”,還需要一個二維數(shù)組存放“走過的地方”。

迷宮:【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

?走過的地方:(這里把所有地點初始化為0,代表尚未經(jīng)過,經(jīng)過的地方會被重新賦值為1)

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

?4.最后,當(dāng)我們“走”到終點的時候,路徑的每一個“點”都會存放到“?!敝?,我們將其依次彈出即可得到最終路徑。【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

?過程截圖:

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題?


棧:

順序棧,棧中每一個結(jié)構(gòu)體對應(yīng)一個點,x表示該點的橫坐標(biāo),y表示該點的縱坐標(biāo),direction表示該點的方向。

代碼實現(xiàn):?

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

//定義迷宮 
int arr[MAXSIZE][MAXSIZE] = {
	1,1,1,1,1,1,1,1,1,1,
	1,0,0,1,1,1,1,1,1,1,
	1,1,0,1,0,0,0,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,0,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,0,0,0,1,0,2,1,
	1,1,1,1,1,1,1,1,1,1
};

//行走過的標(biāo)志
int arr_tar[MAXSIZE][MAXSIZE] = {0};
 
//棧的數(shù)據(jù)域 
typedef struct Stack
{
	int x;
	int y;
	int direction;
}Stack;

//順序棧 
typedef struct SqStack
{
	Stack* base;
	int top;
}SqStack;

//初始化
void InitStack(SqStack* stack)
{
	stack->base = (Stack*)malloc(MAXSIZE * MAXSIZE * sizeof(Stack));
	stack->top = 0;
}
 
//入棧
void InsertStack(SqStack* stack, Stack data)
{
	stack->base[stack->top] = data;
	stack->top++;
	
	printf("arr[%d][%d]成功入棧!\n", data.x, data.y);
} 

//出棧 
Stack PopStack(SqStack* stack)
{
	stack->top--;
	
	printf("arr[%d][%d]成功出棧!\n", stack->base[stack->top].x, stack->base[stack->top].y);
	return stack->base[stack->top];
}

//判棧空
int StackEmpty(SqStack* stack)
{
	if (stack->top == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
 
//取棧頂元素
Stack GetTop(SqStack* stack)
{
	int q = stack->top - 1;
	
	return stack->base[q];
}
 
//判斷該位置是否為墻和之前是否經(jīng)過 
int CanPass(Stack data)
{
	if (arr[data.x][data.y] == 1 || arr_tar[data.x][data.y] == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
 
//判斷該位置是否為出口 
int IsEnd(Stack data)
{
	if (arr[data.x][data.y] == 2) 
	{
		printf("發(fā)現(xiàn)出口?。?!\n"); 
		return 1;
	}
	else
	{
		return 0;
	}
}

//移動
void move(SqStack* stack)
{
	Stack data = GetTop(stack);
	Stack new_data;
	
	if (data.direction == 1)//東 
	{
		printf("向東走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x;
		new_data.y = data.y + 1;
	}
	else if (data.direction == 2)//南 
	{
		printf("向南走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x + 1;
		new_data.y = data.y;
	}
	else if (data.direction == 3)//西 
	{
		printf("向西走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x;
		new_data.y = data.y - 1;
	}
	else if (data.direction == 4)//北 
	{
		printf("向北走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x - 1;
		new_data.y = data.y;
	}

	InsertStack(stack, new_data);
} 

//更新走過的路徑
void AddPath(Stack data)
{
	arr_tar[data.x][data.y] = 1;
}
void PopPath(Stack data)
{
	arr_tar[data.x][data.y] = 0;
}
 
int main()
{
	SqStack* stack = (SqStack*)malloc(sizeof(SqStack));
	//遍歷迷宮 
	int i, j;
	for (i = 0;i < MAXSIZE; i++)
	{
		for (j = 0;j < MAXSIZE; j++)
		{
			printf("%d\t", arr[i][j]);
		}
		printf("\n");
	}
	
		
	printf("--------------------破譯中--------------------\n");
	
	//初始化
	InitStack(stack);
	//設(shè)置初始點 
	int x = 1, y = 1;
	Stack data = {x, y, 1};
	InsertStack(stack, data);

	do
	{
		if(!CanPass(GetTop(stack)))//不是墻并且從未走過 
		{
			if (IsEnd(GetTop(stack)))//檢測出口 
			{
				break;
			}
			else
			{
				AddPath(GetTop(stack));
				move(stack);//添加下一個塊到棧中	
			} 
		}
		else//是墻 
		{
 			PopStack(stack);
 			PopPath(GetTop(stack));//棧頂元素的路徑不算入經(jīng)過地點 
 			
 			if (!StackEmpty(stack))
 			{
 				if (GetTop(stack).direction == 4 && !StackEmpty(stack))
 				{
 					AddPath(GetTop(stack));
 					PopStack(stack);
 					PopPath(GetTop(stack));
				}
				if (GetTop(stack).direction < 4)
				{
					//更新棧頂坐標(biāo)的方向
					stack->base[stack->top - 1].direction++;		
				}
			}
		} 
		//getchar();
	}while(!StackEmpty(stack));
	
	printf("--------------------破譯完畢--------------------\n");
	//輸出結(jié)果
	while (!StackEmpty(stack))
	{
		data = PopStack(stack);
		arr[data.x][data.y] = 3;
	} 
	//遍歷迷宮 
	for (i = 0;i < MAXSIZE; i++)
	{
		for (j = 0;j < MAXSIZE; j++)
		{
			printf("%d\t", arr[i][j]);
		}
		printf("\n");
	}
	 
	return 0;
} 

歡迎大家留言交流

結(jié)語:這不僅僅是一個算法,你把他加點功能(增刪改查),他就變成了期末的課程設(shè)計。

【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題文章來源地址http://www.zghlxwxcb.cn/news/detail-473130.html

到了這里,關(guān)于【數(shù)據(jù)結(jié)構(gòu) 迷宮問題求解】棧的應(yīng)用|c語言|迷宮問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 【C數(shù)據(jù)結(jié)構(gòu)】迷宮問題

    【C數(shù)據(jù)結(jié)構(gòu)】迷宮問題

    前言: 本章記錄作者學(xué)習(xí)中,遇到的兩個比較有趣的問題,一個簡單和一個較復(fù)雜的迷宮問題。 ? ? 讓我們先來看簡單的:迷宮問題 它的具體要求: 輸入描述: 輸入兩個整數(shù),分別表示二維數(shù)組的行數(shù),列數(shù)。再輸入相應(yīng)的數(shù)組,其中的 1表示墻壁 , 0表示可以走的路 。

    2024年02月02日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】迷宮問題實現(xiàn)(包含界面)

    【數(shù)據(jù)結(jié)構(gòu)】迷宮問題實現(xiàn)(包含界面)

    ???? 問題描述:假設(shè)迷宮由m行n列構(gòu)成,有一個入口和一個出口,入口坐標(biāo)為(1,1),出口坐標(biāo)為(m,n),試設(shè)計并驗證一下算法:找出一條入口通往出口的路徑,或報告一個\\\"無法通過\\\"的信息。 具體需求如下: 用C語言實現(xiàn)順序存儲結(jié)構(gòu)上隊列的基本操作,然后利用該隊列的基本操

    2024年02月04日
    瀏覽(12)
  • 數(shù)據(jù)結(jié)構(gòu)——迷宮問題(順序棧、C++)

    數(shù)據(jù)結(jié)構(gòu)——迷宮問題(順序棧、C++)

    ?講解: 一、采用二維數(shù)組和srand函數(shù)隨機生成只有0和1的迷宮。 二、求解迷宮大概思路:先將入口處的坐標(biāo)即方向d入棧,然后當(dāng)棧不為空時,取出棧頂(即當(dāng)前節(jié)點)的數(shù)據(jù)。遍歷當(dāng)前節(jié)點的四個方向,找到可行的下一個節(jié)點,并將其入棧;如沒有可行的下一個節(jié)點,則將

    2024年02月13日
    瀏覽(18)
  • 《數(shù)據(jù)結(jié)構(gòu)與算法分析》課程設(shè)計——迷宮問題

    《數(shù)據(jù)結(jié)構(gòu)與算法分析》課程設(shè)計——迷宮問題

    中國礦業(yè)大學(xué)信控學(xué)院 ? 補一下我之前在博客園發(fā)布的內(nèi)容 ?懶得調(diào)了, 想復(fù)制完整代碼直接復(fù)制最下面的 ,想復(fù)制分布代碼去看我博客園鏈接吧 《數(shù)據(jù)結(jié)構(gòu)與算法分析》課程設(shè)計——迷宮問題 - 刷子zz - 博客園 一、? 問題描述 問題中迷宮可用方陣[m,n]表示,0表示能通過

    2024年02月10日
    瀏覽(21)
  • 【數(shù)據(jù)結(jié)構(gòu)-字符串 三】【棧的應(yīng)用】字符串解碼

    【數(shù)據(jù)結(jié)構(gòu)-字符串 三】【棧的應(yīng)用】字符串解碼

    廢話不多說,喊一句號子鼓勵自己:程序員永不失業(yè),程序員走向架構(gòu)!本篇Blog的主題是【字符串轉(zhuǎn)換】,使用【字符串】這個基本的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn),這個高頻題的站點是: CodeTop ,篩選條件為: 目標(biāo)公司+最近一年+出現(xiàn)頻率排序 ,由高到低的去 ??蚑OP101 去找,只有兩個

    2024年02月07日
    瀏覽(45)
  • 【數(shù)據(jù)結(jié)構(gòu)】迷宮問題DFS非遞歸(c語言實現(xiàn))

    【數(shù)據(jù)結(jié)構(gòu)】迷宮問題DFS非遞歸(c語言實現(xiàn))

    本來之前寫過一個推箱子,就想著寫個迷宮游戲,因為想著推箱子游戲里面也有墻,也有玩家的移動,比推箱子簡單的是還不用判斷前面是否有箱子的情況,但是自己寫的迷宮游戲如果自己隨機生成的迷宮地圖的話,不一定會有通路,他要學(xué)一個什么隨機迷宮的生成,剛看完

    2024年02月08日
    瀏覽(22)
  • C數(shù)據(jù)結(jié)構(gòu)與算法——隊列 應(yīng)用(C語言純享版 迷宮)

    C數(shù)據(jù)結(jié)構(gòu)與算法——隊列 應(yīng)用(C語言純享版 迷宮)

    實驗任務(wù) (1) 掌握順序循環(huán)隊列及其C語言的表示; (2) 掌握入隊、出隊等基本算法的實現(xiàn); (3) 掌握順序循環(huán)隊列的基本應(yīng)用(求解迷宮通路)。 實驗內(nèi)容 使用C語言實現(xiàn)順序循環(huán)隊列的類型定義與算法函數(shù); 編寫main()函數(shù)并根據(jù)需要修改、補充相關(guān)的類型定義與函數(shù),以實

    2024年02月15日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)與算法-(7)---棧的應(yīng)用-(4)后綴表達式求值

    數(shù)據(jù)結(jié)構(gòu)與算法-(7)---棧的應(yīng)用-(4)后綴表達式求值

    ??write in front?? ??大家好,我是Aileen??.希望你看完之后,能對你有所幫助,不足請指正!共同學(xué)習(xí)交流. ??本文由Aileen_0v0?? 原創(chuàng) CSDN首發(fā)?? 如需轉(zhuǎn)載還請通知?? ??個人主頁:Aileen_0v0??—CSDN博客 ??歡迎各位→點贊?? + 收藏?? + 留言??? ??系列專欄:Aileen_0v0??

    2024年02月07日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)】棧的使用|模擬實現(xiàn)|應(yīng)用|棧與虛擬機棧和棧幀的區(qū)別

    【數(shù)據(jù)結(jié)構(gòu)】棧的使用|模擬實現(xiàn)|應(yīng)用|棧與虛擬機棧和棧幀的區(qū)別

    目錄 一、棧(Stack) 1.1 概念 1.2 棧的使用 1.3 棧的模擬實現(xiàn) 1.4 棧的應(yīng)用場景 1. 改變元素的序列 2. 將遞歸轉(zhuǎn)化為循環(huán) 3. 括號匹配 4. 逆波蘭表達式求值 5. 出棧入棧次序匹配 6. 最小棧 1.5 概念區(qū)分 推薦 前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分

    2024年02月04日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu):鏈表帶環(huán)問題的求解

    數(shù)據(jù)結(jié)構(gòu):鏈表帶環(huán)問題的求解

    個人主頁 :個人主頁 個人專欄 :《數(shù)據(jù)結(jié)構(gòu)》《C語言》 思路 我們定義兩個變量,slow和fast,慢指針slow一次走一步,快指針fast一次走兩步,則如果鏈表帶環(huán),slow和fast一定在環(huán)中相遇。思路很簡單,但是為什么??? 解釋1 當(dāng)slow剛進入環(huán)部分,fast與slow相距N個節(jié)點時。 s

    2024年02月14日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包