用廣度優先搜尋方法解決放置炸彈遊戲

2021-08-19 01:54:30 字數 1861 閱讀 4348

炸彈遊戲規則:在乙個n*n的方陣裡,每乙個方格分別代表空地,敵人,牆,三種元素的分布為隨機分布,現在玩家要從地圖的某乙個空地(已知座標點)出發,走到乙個空地上放置炸彈,炸彈可以炸毀該點對應行列上的所有敵人,但是炸彈不能炸穿牆,要求的是玩家在哪乙個點放置炸彈能夠炸掉最多敵人,最多炸幾個?(注意:必須考慮玩家從出發點到放置炸彈點之間的可通過路徑,即玩家只能通過空地走到放置炸彈點,且不能走牆外。)

/*在程式中,我們自定義乙個規格不超過20*20的地圖,用「#」表示牆,「 . 」 表示空地,「g」表示敵人*/

#includestruct note //定義乙個結構體來產生乙個佇列

; char a[20][20]; //假設地圖的規格不超過20*20;

int getnum(int i,int j) //統計在(i,j)炸掉的敵人個數的函式;

x=i;y=j; //重新定位回(i,j)點;

while(a[x][y]!='#')

x=i;y=j;

while(a[x][y]!='#')

x=i;y=j;

while(a[x][y]!='#')

return sum; //返回炸掉的敵人個數

} int main()

; //book用來標記哪些點是已經走過的,防止重複走,標記為1時表示為走過,初始化時全為0;

int next[4][2]=,,,}; //next陣列分別表示向右,向下,向左,向上走一步;

int m,n,i,j,startx,starty,max=0,sum=0,mx,my,k,tx,ty; //m,n分別為地圖的規格,i,j為定義地圖時for迴圈用到的變數,(startx,starty)為玩家起始點,max為消滅的最多敵人,sum為在每乙個空地所能消滅的敵人的個數,(mx,my)為放置炸彈的座標,k為分別進行向上下左右進行移動的標記次數,(tx,ty)為進行移動後玩家的新座標;

scanf("%d%d%d%d",&m,&n,&startx,&starty); //自定義地圖;

for(i=0;i<=m-1;i++)

scanf("%s",a[i]);

while(a[startx][starty]=='#'||a[startx][starty]=='g') //判斷玩家的起點是否為空地,如果不是就重新輸入;

head=1; //初始化佇列;

tail=1;

que[tail].x=startx;

que[tail].y=starty;

book[startx][starty]=1; //對玩家起點進行標記,表示已經走過;

tail++; //隊尾擴充套件;

max=getnum(startx,starty); 統計起點所能消滅的敵人,呼叫getnum函式;

mx=startx;

my=starty;

while(headm-1||ty<0||ty>n-1) //判斷玩家有沒有走到地圖外

continue;

if(a[tx][ty]==' . '&&book[tx][ty]==0) //確保走到的地方為空地且沒有走過;

{book[tx][ty]=1; //先標記為走過;

que[tail].x=tx; //將該點座標加入佇列;

que[tail].y=ty;

tail++; //擴充套件佇列;

sum=getnum(tx,ty); //計算該點消滅敵人的個數;

if(max

深度優先搜尋 廣度優先搜尋(解決小哈)

問題省略 思路 讓小哼往右邊走,直到走不通的時候再回到這裡,再去嘗試另乙個方向。規定乙個順序,按順時針方向來嘗試 即按照右 下 左 上的順序去嘗試 先 檢查小哼是否已經到達小哈的位置,如果沒有到達則找出下一步可以走的地方。為了解決這個問題,此處dfs 函式只需要維護3個引數,分別是x座標 y座標 以...

廣度優先搜尋解決八數碼問題

程式描述 基於盲目搜尋策略的寬度優先搜尋方法 include include include include include include include using namespace std define n 9 九宮格總數字 陣列定義 0 9階乘定義 const int jc n 1 0 9...

用DFS(廣度優先遍歷)解決排列問題

例如有 三個字元,求解所有由這三個字元排列得到的字串。解題思路 一次排列中已經遍歷過的元素不能重複遍歷,因此需要對新增過的元素進行標記,避免本次排列出現重複。這種問題在一次排列求解完成之後還需要繼續求解,在本次排列結束後,為了保證已經訪問過但是不在當前遞迴鏈中的元素可以繼續被訪問,需要對這個元素取消...