http://poj.org/problem?id=1915
与2243题目大致意思一样,只是修改下范围,修改下上限与下限
程序如下:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <queue>
#define maxn 305
using namespace std;
int x1,y1,x2,y2,n;
queue<int> xx;
queue<int> yy;//定义一个队列
int sum;
int dx[8]={-2,-1,1,2,2,1,-1,-2};
int dy[8]={-1,-2,-2,-1,1,2,2,1};
bool map[maxn][maxn];
int levels[maxn][maxn];
bool inmap(int x,int y) //判断所走的路不要出边界
{
return (x<n && y<n&&x>=0 &&y>=0);
}
void bfs(int x,int y)//广搜程序
{
for(int k=0;k<8;k++)
{
if(inmap(x+dx[k],y+dy[k])&&!map[x+dx[k]][y+dy[k]]) //在有界的范围内,且没有被访问过
{
map[x+dx[k]][y+dy[k]]=true;
levels[x+dx[k]][y+dy[k]]=levels[x][y]+1;
xx.push(x+dx[k]);
yy.push(y+dy[k]);//让其入栈
if((x+dx[k]==x2)&&(y+dy[k]==y2)) //直到等于x2,y2
{
sum=levels[x+dx[k]][y+dy[k]];//此时的和为sum
return;
}
}
}
if(!xx.empty()) //出栈
{
xx.pop();
yy.pop();
}
if(!xx.empty())
{
bfs(xx.front(),yy.front());//取队首
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
sum=0;
while(!xx.empty())
{
xx.pop();
yy.pop();
}
memset(map,false,sizeof(map));
memset(levels,0,sizeof(levels));
xx.push(x1);//
yy.push(y1);
map[x1][y1]=true;
levels[x1][y1]=0;//初始化最初的点
bfs(x1,y1);
printf("%d\n",sum);
}
return 0;
}