1. 程式人生 > >POJ 1915(BFS_D題)解題報告

POJ 1915(BFS_D題)解題報告

題目 pan 位置 open con play def sta 鏈接

題目鏈接:http://poj.org/problem?id=1915

--------------------------------------------------------

題意:Chess中的騎士巡遊,問從給定點到目標點的最小的路徑長度為多少?

思路:給定八個方向,每次層次遍歷一層的所有方向的位置,將值++。最先到達目標點的路徑長度一定最小。最開始還是dfs的想法,結果一直RE,後來分析時候終於明白了,函數調用過多,最終爆棧。

代碼:

技術分享圖片
#include<cstdio>
#include<cstring>
#include<algorithm>
#include
<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll;
const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN =300+10; int T =0; int n =0; int vis[MAXN][MAXN]; int endx; int endy; int dir[8][2]={2,1,1,2,-2,-1,-1,-2,-2,1,-1,2,2,-1,1,-2}; struct State{ int x; int y; int count1; }chess[MAXN]; int CheckState(State s) { if((s.x<n&&s.y<n)&&(s.x>=0
&&s.y>=0)&& !vis[s.x][s.y] ) return 1; else return 0; } int bfs(State st){ queue<State> q; State now , next; st.count1 = 0; q.push(st); vis[st.x][st.y]=1; while(!q.empty()){ now =q.front(); if (now.x==endx&&now.y==endy){ return now.count1; } for(int i=0;i<8;i++) { next.x=now.x+dir[i][0]; next.y=now.y+dir[i][1]; next.count1=now.count1+1; if(CheckState(next)) { q.push(next); vis[next.x][next.y]=1; } } q.pop(); } } int main(void){ scanf("%d",&T); for(int i=0;i<T;i++){ n=0; scanf("%d",&n); for(int k=0;k<n;k++){ for(int j=0;j<n;j++){ vis[k][j]=0; } } for(int k=0;k<MAXN;k++){ chess[k].x=0; chess[k].y=0; } State sta; endx=0; endy=0; scanf("%d %d",&sta.x,&sta.y); scanf("%d %d",&endx,&endy); int ans =bfs(sta); printf("%d\n",ans); } return 0; }
View Code

POJ 1915(BFS_D題)解題報告