c_cpp GFG骑士步行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp GFG骑士步行相关的知识,希望对你有一定的参考价值。
#include <bits/stdc++.h>
using namespace std;
// #GFG #Backtracking #DynamicProgramming
// https://practice.geeksforgeeks.org/problems/knight-walk/0/?ref=self
int n; // global
// vector< vector<int> > grid; // if grid
bool valid(int x,int y){
// [1,n] (1 indexed board)
if(x<1 || y<1 || x>n || y>n){
return false; // if out of bounds
}
return true;
}
int shortestDistance(int sr, int sc, int dr, int dc){
if(sr==dr && sc==dc){
return 0; // if at destination
}
map<pair<int,int> ,bool> visited;
queue<pair<int,int>> Q;
Q.push({sr,sc});
visited[{sr,sc}]=true;
int steps=0;
while(!Q.empty()){
steps++;
int levelSize=Q.size();
// at each step, 8 possible movements
for(int i=0;i<levelSize;i++){
int x=Q.front().first;
int y=Q.front().second;
vector<int> var1={-1,1}; // variations
vector<int> var2={-2,2};
// row+1 and col+2 variations
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
int newX=x+var1[j];
int newY=y+var2[k];
if(valid(newX,newY)){
if(newX==dr && newY==dc){
return steps; // if dest is reached
}
if(visited[{newX,newY}]!=true){
Q.push({newX,newY});
visited[{newX,newY}]=true;
}
}
}
}
// row+2 and col+1 variations
for(int j=0;j<2;j++){
for(int k=0;k<2;k++){
int newX=x+var2[j];
int newY=y+var1[k];
if(valid(newX,newY)){
if(newX==dr && newY==dc){
return steps;
}
if(visited[{newX,newY}]!=true){
Q.push({newX,newY});
visited[{newX,newY}]=true;
}
}
}
}
Q.pop(); // remove current position
}
}
return -1; // no path
}
int main(){
freopen("ip.txt","r",stdin);
int t;
cin>>t;
while(t--){
// square chess board;
cin>>n; // NXN n defined globally
// for rXc chess board define a board
// int r,c;
// cin>>r;
// c=r; // for N X N chess board
// grid.resize(r+1);
// for(int i=0;i<r;i++){
// grid[i].resize(c+1); // all valid cells in chess board
// // for(int j=0;j<c;j++){
// // cin>>grid[i][j];
// // }
// }
int sr,sc,dr,dc;
cin>>sr>>sc;
cin>>dr>>dc;
cout<<shortestDistance(sr,sc,dr,dc)<<endl;
// grid.resize(0);
}
return 0;
}
以上是关于c_cpp GFG骑士步行的主要内容,如果未能解决你的问题,请参考以下文章