有些類似於 N-queues,又不一樣,判斷是否可以放置blockhouse的條件不同。
而且是全搜,並非是N-0queues的按行搜索。
代碼如下:
#include <iostream>
using namespace std;
int visit[10][10], count, ret, N;
bool isLocate(int x, int y) {
for(int j = y; j >= 1; j--) {
if( visit[x][j] == 1 )
return 0;
if(visit[x][j] == 2)
break;
}
for(int j = y; j <= N; j++) {
if( visit[x][j] == 1 )
return 0;
if(visit[x][j] == 2)
break;
}
for(int i = x; i >= 1; i--) {
if( visit[i][y] == 1 )
return 0;
if(visit[i][y] == 2)
break;
}
for(int i = x; i <= N; i++) {
if( visit[i][y] == 1 )
return 0;
if(visit[i][y] == 2)
break;
}
return 1;
}
void dfsHelper() {
if(count > ret)
ret = count;
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= N; j++) {
if(!visit[i][j] && isLocate(i, j)) {
count ++;
visit[i][j] = 1;
dfsHelper();
visit[i][j] = 0;
count --;
}
}
}
}
int main(void) {
char str[10];
while(cin >> N && N) {
ret = 0, count = 0;
for(int i = 1; i <= N; i++) {
cin >> str;
for(int k = 0; k < N; k++)
visit[i][k + 1] = (str[k] == 'X' ? 2 : 0);
}
dfsHelper();
cout << ret << endl;
}
return 0;
}