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骑士步行的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp GFG发现号码

c_cpp GFG排序矩阵行

c_cpp GFG最低成本路径

c_cpp GFG重复和失踪

c_cpp GFG谁将获胜

c_cpp GFG按特定顺序排序