题目链接: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; }