#include <bits/stdc++.h>
using namespace std;
int Maxn, n;
char board[5][5];
bool canPut(int x, int y) {
if(board[x][y] == 'X')
return false ;//can't put in this place
int i,j;
for(i = x-1 ; i >= 0; --i) {
if( board[i][y] == 'X')
break; //if there is a wall,would be ok
if(board[i][y] == '$')//this rows exist an bomb
return false;
}
for(j = y-1; j >= 0; --j) {
if( board[x][j] == 'X')//if there is a wall,would be ok
break;
if( board[x][j] == '$')
return false;
}
return true;
}
void dfs(int num, int index) {
if(index == n * n) {//收到最后了
Maxn = max(Maxn, num);
return;
}
int x = index / n;
int y = index % n;
if(canPut(x, y)) {//能放
char c = board[x][y];
board[x][y] = '$';//放
dfs(num+1, index+1);
board[x][y] = c;//回溯
dfs(num, index+1);//不放
} else {//不能放
dfs(num, index+1);
}
}
int main() {
freopen("data.in", "r", stdin);
while(cin >> n && n != 0) {
int i, j;
Maxn = INT_MIN;
for( i = 0; i < n; ++i)
for(j = 0; j < n; ++j)
cin >> board[i][j];
dfs(0, 0);//初始状态炮台数,索引都为0
cout<<Maxn<<endl;
}
}
HDU1045:Fire Net(DFS)
最新推荐文章于 2024-03-26 20:22:53 发布