这道里原来我在看别人代码之前, 也写过。 洋洋洒洒的写了一个main函数四个嵌套for循环, 第一次的大手笔。运行结果没有问题, 但就是提交不上去, 还不收呢?搁置了好几天后, 没办法放弃。
后来看了一下别人的代码, 写完后提交编译错误, 都是因为跟系统函数重名缘故。
这道题的名头是,DFS(Depth-First-Search)深度优先搜索算法
#include "iostream"
using namespace std;
#define size 5
char a[size][size];
int maxNum = 0; //保存着最终的个数
/*
checkA这个函数是检验当前位置可否放置blockhouses
*/
bool checkA(int row, int col){
int i, j;
if( a[row][col] == 'X' )
return false;
for( i = row ; i >= 0; i-- ){
if( a[i][col] == 'X' )
break;
if( a[i][col] == 'A')
return false;
}
for( j = col ; j >= 0; j-- ){
if( a[row][j] == 'X' )
break;
if( a[row][j] == 'A')
return false;
}
return true;
}
void appendA(int n, int k, int num){
//当遍历到最后时, 返回
if(k == n * n){
if( num > maxNum )
maxNum = num;
return;
}
int i = k / n;
int j = k % n;
if( checkA( i, j ) ){
a[i][j] = 'A'; //在a[i][j]处放置一个blockhouses , 并把这儿标记为A
appendA(n, k+1, num+1); //放置blockhouses后进入下层递归
a[i][j] = '.'; //可能该位置不放置blockhouses的情况可得出最优解
}
appendA(n, k+1, num); //不放置blockhouses后进入下层递归
}
int main(){
int n;
while( cin >> n && n ){
maxNum = 0;
int i, j;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
cin>>a[i][j];
}
}
appendA(n, 0, 0); //数组大小是n*n, 我们从(0,0)开始进行运算, 第三个参数是num, 累计个数
cout<<maxNum<<endl;
}
return 0;
}