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迷宫问题模型(具体模拟过程见《啊哈算法》)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国家网信办拟规定:使用人脸识别技术应取得
- 下一篇: hadoop中两种上传文件方式