日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BFS迷宫问题模型(具体模拟过程见《啊哈算法》)

發(fā)布時間:2023/12/2 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BFS迷宫问题模型(具体模拟过程见《啊哈算法》) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述與DFS模型走迷宮那篇一樣。小哈被困在迷宮里,小哼解救小哈。

這里用BFS來寫。BFS(廣搜)與DFS(深搜)的區(qū)別就在于,DFS是“不撞南墻不回頭”,一條路走到不能再走之后才會回到起始點,另開辟一條新的道路;而BFS是將道路層層擴展,走到一個點時會同時搜索附近能到達的點,同時進行。

這里先附上我最開始的代碼(但編譯出來是錯的):

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
#include<set>
#include<map>
using namespace std;
struct node
{
??? int x,y,s;
};
int main()
{
??? struct node q[5000];
??? int a[1005][1005]={0},book[1005][1005]={0};
??? int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
??? int i,j,n,m,p,q1,tx,ty,flag=0;
??? int head,tail;? //隊列
??? scanf("%d%d",&n,&m);
??? scanf("%d%d",&p,&q1);
??? for(i=1;i<=n;i++)
??? {
??????? for(j=1;j<=m;j++)
??????? {
??????????? scanf("%d",&a[i][j]);
??????? }
??? }
??? head=1;
??? tail=1;
??? q[head].x=1;
??? q[head].y=1;
??? q[head].s=0;
??? tail++;
??? book[1][1]=1;
??? while(head<tail)
??? {
??????? for(i=1;i<=3;i++)
??????? {
??????????? tx=q[head].x+dir[i][0];
??????????? ty=q[head].y+dir[i][1];
??????????? if(tx>n||tx<1||ty>m||ty<1)
??????????????? continue;
??????????? if(a[tx][ty]==0&&book[tx][ty]==0)
??????????? {
??????????????? book[tx][ty]=1;
??????????????? q[tail].x=tx;
??????????????? q[tail].y=ty;
??????????????? q[tail].s=q[head].s+1;
??????????????? tail++;
??????????? }
??????????? if(tx==p&&ty==q1)
??????????? {
??????????????? flag=1;
??????????????? break;
??????????? }
??????? }
??????? if(flag==1)
??????????? break;
??????? else
??????????? head++;
??? }
??? printf("%d\n",q[head-1].s);? //這個時候tail指向隊列的末尾
??? return 0;
}

一開始是不能輸出,把最開始的那些變量定義在主函數前竟然就可以進行輸入了(我也不知道為啥)。然后可以輸入之后,我嘗試了這組數據,但輸出是0,還是錯的:

問了同學,她把我的輸入輸出格式給改了(cin? cout,但是我覺得這沒什么影響呀);還有走四個方向的那個for循環(huán),我 i? 一開始從1開始,這樣就只進行了三個方向的搜索,應該從i=0開始;最后是輸出q[head].s,而不是head-1;最后正確代碼如下:

#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<math.h>
#include<set>
#include<map>
using namespace std;
struct node
{
??? int x,y,s;
} ;
struct node q[5000];
int a[1005][1005]= {0};
int book[1005][1005]= {0}, dir[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};
int main()
{
??? int i,j,n,m,p,q1,tx,ty,flag=0;
??? int head,tail;? //隊列
??? cin>>n>>m;
??? for(i=1; i<=n; i++)
??? {
??????? for(j=1; j<=m; j++)
??????? {
??????????? scanf("%d",&a[i][j]);
??????? }
??? }
??? cin>>p>>q1;
??? head=1;
??? tail=1;
??? q[head].x=1;
??? q[head].y=1;
??? q[head].s=0;
??? tail++;
??? book[1][1]=1;
??? while(head<tail)
??? {
??????? for(i=0; i<=3; i++)
??????? {
??????????? tx=q[head].x+dir[i][0];
??????????? ty=q[head].y+dir[i][1];
??????????? if(tx>n||tx<1||ty>m||ty<1)
??????????????? continue;
??????????? if(a[tx][ty]==0&&book[tx][ty]==0)
??????????? {
??????????????? book[tx][ty]=1;
??????????????? q[tail].x=tx;
??????????????? q[tail].y=ty;
??????????????? q[tail].s=q[head].s+1;
??????????????? tail++;
??????????? }
??????????? if(tx==p&&ty==q1)
??????????? {
??????????????? flag=1;
??????????????? break;
??????????? }
??????? }
??????? if(flag==1)
??????????? break;
??????? else
??????????? head++;
??? }
??? printf("%d\n",q[head].s+1);? //這個時候tail指向隊列的末尾
??? return 0;
}

?

轉載于:https://www.cnblogs.com/programming123/p/10833757.html

總結

以上是生活随笔為你收集整理的BFS迷宫问题模型(具体模拟过程见《啊哈算法》)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。