【题解-信息学奥赛一本通】1257:Knight Moves

📅 2026/7/17 20:50:05
【题解-信息学奥赛一本通】1257:Knight Moves
题目1257Knight Moves题目描述输入n代表有个n×n的棋盘输入开始位置的坐标和结束位置的坐标问一个骑士朝棋盘的八个方向走马字步从开始坐标到结束坐标可以经过多少步。输入首先输入一个n,表示测试样例的个数。每个测试样例有三行。第一行是棋盘的大小L(4≤L≤300)第二行和第三行分别表示马的起始位置和目标位置(0…L−1)。输出马移动的最小步数起始位置和目标位置相同时输出0。时空限制1s / 64MB样例输入3 8 0 0 7 0 100 0 0 30 50 10 1 1 1 1样例输出5 28 0代码#includebits/stdc.husingnamespacestd;typedefpairint,intPII;constintN30010;intt,n,m,sx,sy,ex,ey;charg[N][N];intdis[N][N];intdx[10]{-2,-1,1,2,2,1,-1,-2},dy[10]{1,2,2,1,-1,-2,-2,-1};voidbfs(intx,inty){queuePIIq;q.push({x,y});dis[x][y]0;while(!q.empty()){PII tq.front();q.pop();for(inti0;i8;i){intxxt.firstdx[i],yyt.seconddy[i];if(xx0||xxn||yy0||yyn)continue;if(dis[xx][yy]-1){q.push({xx,yy});dis[xx][yy]dis[t.first][t.second]1;if(xxexyyey)return;}}}}intmain(){cint;while(t--){cinn;cinsxsy;cinexey;if(sxexsyey){puts(0);continue;}memset(dis,-1,sizeofdis);bfs(sx,sy);coutdis[ex][ey]endl;}return0;}结果