有墙的棋盘上的最大车数

问题描述

问题链接 - https://www.spoj.com/PCP2S112/problems/PCROOK/

问题简而言之 - 我们必须找到可以放置在 n*n 棋盘上的最大车数(n

例如

for 4 x 4
.X..
...X
.XX.
XX..

这里 x 是墙,而 .是开放空间

我的方法 - 我尝试回溯,尽可能放置车,然后递归地尝试找到可以放置的最大车数,然后通过移除车来回溯

cpp 代码 -

#include<bits/stdc++.h>
using namespace std;

#define N 4
#define li int64_t


bool isSafe(char board[N][N],int row,int col,int n){
    //check up
    int i = col-1;
    while(i>=0 && board[i][col]!='X'){
        if(board[i][col] == 'R'){
            return false;
        }
        i--;
    }
    //check down
    i = col+1;
    while(i<n && board[i][col]!='X'){
        if(board[i][col] == 'R'){
            return false;
        }
        i++;
    }
    //check right
    i = col+1;
    while(i<n && board[row][i]!='X'){
        if(board[row][i] == 'R'){
            return false;
        }
        i++;
    }
    //check left
    i = col-1;
    while(i>=0 && board[row][i]!='X'){
        if(board[row][i] == 'R'){
            return false;
        }
        i--;
    }
    return true;
}

int count(char board[N][N],int n){
    int ct = 0;
    for(int i = 0;i<n;i++){
        for(int j=0;j<n;j++){
            if(board[i][j] == 'R'){
                ct++;
            }
        }
    }
    return ct;
}

void solve(char board[N][N],int n,int &max){
    if(isSafe(board,row,col,n)){
        board[row][col] = 'R';
        int k = count(board,n);
        if(k>max){
            max = k;
        }
        int curr = n*row+col;
        for(int i=curr+1;i<n*n;i++){
            int r = i/n;
            int c = i%n;
            solve(board,r,c,n,max);
        }
        board[row][col] = '.';
    }
    return;
}

int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        char board[N][N];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>board[i][j];
            }
        }
        int max = 0;
        for(int row = 0;row<n;row++){
            for(int col = 0;col<n;coL++){
                solve(board,max);
            }
        }
        cout<<max<<endl;
    }   
}

我想知道这种方法是否正确。我无法提交解决方案,因为唯一允许的语言是 pascal,而我无法在 pascal 中编码

如果代码太乱,可以使用 Psedo 代码

solve(board,size,&max){
    if possible to place rook here
    {
        board[row][col] = 'R';
        if count of rooks is more than max then set max as count
        for each subsequent square {
            solve(board,max);
        }
        board[row][col] = '.';
    }
    return;
}

main() {
    max = 0
    for each cell{
        solve(board,cell,&max);
    }
    print max
}

预先感谢您的帮助

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)