码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1915(BFS_D题)解题报告

时间:2018-01-28 20:55:21      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:its   分享图片   org   int   list   body   names   else   const   

题目链接: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题)解题报告

标签:its   分享图片   org   int   list   body   names   else   const   

原文地址:https://www.cnblogs.com/caomingpei/p/8372175.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!