POJ 1915(BFS_D题)解题报告

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1915(BFS_D题)解题报告相关的知识,希望对你有一定的参考价值。

题目链接: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题)解题报告的主要内容,如果未能解决你的问题,请参考以下文章

POJ 1321(DP初步_I题)解题报告

POJ 2260(模拟&贪心_B题)解题报告

POJ 3126(BFS_E题)解题报告

POJ 3122 (集训比赛2B_B题)解题报告

POJ 1905(集训比赛2B_A题)解题报告

POJ 1458(DP初步_B题)解题报告