问题描述
问题链接 - 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 中编码
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 (将#修改为@)