POJ1915,雙向寬度優先搜尋
第一道雙先寬度優先搜尋,過了很開心~
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年08月30日 星期四 10時07分17秒
> Description:POJ1915,雙向寬度優先搜尋
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
#define N 301
int n;
int ans;
bool vis[2][N][N];//標記是否到達該點
int steps[2][N][N];//記錄到達每一個座標所需的步數
struct node
{
int x,y;
int step;
node()
{
x=y=step=0;
}
}star,en;
int dir[8][2]={{-2,1},{-2,-1},{-1,2},{-1,-2},{1,2},{1,-2},{2,1},{2,-1}};
bool check(int x, int y)
{
return (0<=x&&x<n&&0<=y&&y<n);
}
bool bfs()
{
memset(vis,false,sizeof(vis));
queue<node>Q[2];
if (star.x==en.x&&star.y==en.y)
{
ans=0;
return true;
}
Q[0].push(star);
Q[1].push(en);
vis[0][star.x][star.y]=true;
vis[1][en.x][en.y]=true;
steps[0][star.x][star.y]=0;
steps[1][en.x][en.y]=0;
node cur,nex;
int inx=0;
while (!Q[0].empty()||!Q[1].empty())
{
inx=(inx^1);//每一次換一個佇列進行擴充套件,亦可寫作inx=(inx+1)%2;
int the_size=Q[inx].size();
for (int i=0; i<the_size; i++)
{
cur=Q[inx].front();
Q[inx].pop();
for (int j=0; j<8; j++)
{
nex.x=cur.x+dir[j][0];
nex.y=cur.y+dir[j][1];
nex.step=cur.step+1;
if (check(nex.x,nex.y))
{
if (vis[inx^1][nex.x][nex.y])//如果已經相遇
{
ans=nex.step+steps[inx^1][nex.x][nex.y];
return true;
}
if (!vis[inx][nex.x][nex.y])
{
vis[inx][nex.x][nex.y]=true;
steps[inx][nex.x][nex.y]=nex.step;
Q[inx].push(nex);
}
}
}
}
}
return false;
}
int main()
{
// freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t;
while(~scanf("%d",&t))
{
while(t--)
{
scanf("%d",&n);
scanf("%d %d",&star.x,&star.y);
scanf("%d %d",&en.x,&en.y);
star.step=en.step=0;
ans=-1;
bfs();
printf("%d\n",ans);
}
}
return 0;
}
相關文章
- c++ 廣度優先搜尋(寬搜)C++
- 【演算法】廣度/寬度優先搜尋(BFS)演算法
- ybtoj:廣度優先搜尋
- bfs廣度優先搜尋
- 圖的遍歷:深度優先搜尋與廣度優先搜尋
- 圖的廣度優先搜尋和深度優先搜尋Python實現Python
- python 二叉樹深度優先搜尋和廣度優先搜尋Python二叉樹
- 基本演算法——深度優先搜尋(DFS)和廣度優先搜尋(BFS)演算法
- js版本的(廣、深)度優先搜尋JS
- 深度優先搜尋
- 【程式碼隨想錄】廣度優先搜尋
- 演算法筆記(廣度優先搜尋)演算法筆記
- 深度和廣度優先搜尋演算法演算法
- 啟發式搜尋的方式(深度優先,廣度優先)和 搜尋方法(Dijkstra‘s演算法,代價一致搜尋,貪心搜尋 ,A星搜尋)演算法
- 寬度優先遍歷
- ybtoj:深度優先搜尋
- DFS(深度優先搜尋)
- 演算法競賽——BFS廣度優先搜尋演算法
- 「Golang成長之路」迷宮的廣度優先搜尋Golang
- 廣度優先搜尋(BFS)思路及演算法分析演算法
- golang學習筆記——迷宮的廣度優先搜尋Golang筆記
- 演算法(三):圖解廣度優先搜尋演算法演算法圖解
- leetcode 刷題之深度優先搜尋LeetCode
- 【演算法】深度優先搜尋(DFS)演算法
- 單詞接龍---快速建圖----雙向BFS(廣度優先遍歷)
- 0演算法基礎學演算法 搜尋篇第二講 BFS廣度優先搜尋的思想演算法
- 深度優先搜尋演算法(DFS)講解演算法
- 深度優先搜尋演算法-dfs講解演算法
- 【知識點】深度優先搜尋 Depth First Search
- 深度優先搜尋 (Depth First Search 簡稱:DFS)
- 0基礎學演算法 搜尋篇第一講 深度優先搜尋演算法
- 從1到n的全排列(深度優先搜尋)
- 深度優先搜尋(DFS)思路及演算法分析演算法
- LeetCode演算法練習——深度優先搜尋 DFSLeetCode演算法
- 廣度優先搜尋相關面試演算法總結(非圖論方面)面試演算法圖論
- Win10系統下如何更改工作列搜尋框寬度Win10
- 十、深度優先 && 廣度優先
- 深度優先與廣度優先