题目描述:点击打开链接
这道题和八皇后问题十分类似,只是多了一点变化,练一下写回溯,在put函数上僵持了很久,后来终于过了
#include<iostream>
using namespace std;
int Max=0;
int nowmax=0;
char map[4][4];
int N;
int put(int i , int j)
{
int ok = 1;
if(map[i][j] == '1') ok = 0;
for(int k = i;k >= 0;k--)
{
if(map[k][j] == 'X') break;
if(map[k][j] == '1') ok = 0;
}
for(int k = i;k < N;k++)
{
if(map[k][j] == 'X') break;
if(map[k][j] == '1') ok = 0;
}
for(int k = j;k >= 0;k--)
{
if(map[i][k] == 'X') break;
if(map[i][k] == '1') ok = 0;
}
for(int k = j;k < N;k++)
{
if(map[i][k] == 'X') break;
if(map[i][k] == '1') ok = 0;
}
return ok;
}
void pullback(int loc){
for(int i=loc;i<N;i++)
for(int j=0;j<N;j++){
if(map[i][j]!='X'&&put(i,j)){
map[i][j]='1';
nowmax++;
pullback(i);
if(nowmax>Max) Max=nowmax;
nowmax--;
map[i][j]='.';
}
}
}
int main(){
while(cin>>N){
if(N==0) break;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
cin>>map[i][j];
pullback(0);
cout<<Max<<endl;
Max=0;
nowmax=0;
}
return 0;
}