信息奥赛一本通1257:Knight Moves

it2022-05-05  56

【题目描述】 输入n代表有个n×n的棋盘,输入开始位置的坐标和结束位置的坐标,问一个骑士朝棋盘的八个方向走马字步,从开始坐标到结束坐标可以经过多少步。

【输入】 首先输入一个n,表示测试样例的个数。

每个测试样例有三行。

第一行是棋盘的大小L(4≤L≤300);

第二行和第三行分别表示马的起始位置和目标位置(0…L−1)。

【输出】 马移动的最小步数,起始位置和目标位置相同时输出0。

【输入样例】 3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1 【输出样例】 5 28 0 代码如下:

//1257:Knight Moves #include<iostream> #include<cstring> using namespace std; int l,r,c,k,i,j,m,T;//T组数据 int map[301][301]; int num,que[90001][3];//队列,que[i][2]记录走的第几步,que[i][0],记录走过的点横坐标x,que[i][1]纵坐标 int soux,souy,desx,desy,head,tail;//记录出发点、目标点的层数,坐标, int dx[8]={-2,-1,1,2,2,1,-1,-2}, dy[8]={1,2,2,1,-1,-2,-2,-1};//马往8个方向跳 int main() { cin>>T; while(T>0)//T组数据 { cin>>l; cin>>soux>>souy;//输入出发点 cin>>desx>>desy;//输入目标点 if(soux==desx&&souy==desy) { cout<<0<<endl; return 0; } memset(map,0,sizeof(map)); head=0; tail=1; //将起始点入队 que[1][0]=soux; que[1][1]=souy; que[1][2]=0;//步数初始化为0 map[soux][souy]=1;//初始化起点状态 while(head<tail) { head++; int x1,y1; for(i=0;i<8;i++) { x1=que[head][0]+dx[i]; y1=que[head][1]+dy[i]; if(0<=x1&&x1<=l-1&&0<=y1&&y1<=l-1)//坐标不超出边界 if(map[x1][y1]==0)//找到可以跳过去的点,入队列 { tail++;//队列里的点个数加1 que[tail][0]=x1;//保存新入队的点的坐标 que[tail][1]=y1; que[tail][2]=que[head][2]+1;//步数加1 map[x1][y1]=1; if(x1==desx&&y1==desy) { cout<<que[tail][2]<<endl; head=tail+1; break; } } } } T--; } return 0; }

最新回复(0)