1、问题描述
2、对每个单元格进行标号,然后递归,对每个单元格采取能放则放和不放两种决策。形成决策树。
3、
#include <iostream>
#include<cmath>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
#define maxn 4
char s[maxn][maxn];
int ibest,n;
bool judge(int row,int col){//想左上方向判断,因为该坐标右下一定没有碉堡
int i;
for(i=row-1;i>-1;i--){
if(s[i][col]=='X')break;
if(s[i][col]=='O')return false;
}
for(i=col-1;i>-1;i--){
if(s[row][i]=='X')break;
if(s[row][i]=='O')return false;
}
return true;
}
void solve(int k,int current){
int x,y;
if(k=n*n){
ibest=max(current,ibest);
return;
}
x=k/n;//将序号转化为坐标
y=k%n;
if(s[x][y]=='.'&&judge(x,y)){
s[x][y]='O';
solve(k+1,current+1);//注意这里并没有改变current和k的值
s[x][y]='.';//注意恢复单元格
}
solve(k,current);
}
int main(int argc, char** argv) {
int i,j;
while(cin>>n&&n){
for(i=0;i<n;i++){
for(j=0;j<n;j++)
cin>>s[i][j];
}
ibest=0;
solve(0,0);
cout<<ibest;
}
return 0;
}