题目链接
Sample input:
4
.X…
…
XX…
…
2
XX
.X
3
.X.
X.X
.X.
3
…
.XX
.XX
4
…
…
…
…
0
Sample output:
5
1
5
2
4
思路:类似于八皇后问题,不过这个多了一堵墙,判断一个方格能否放碉堡,只需要考虑同行或同列之前的方格的碉堡放置情况,如果前面的方格隔了堵墙或没有碉堡(之前想复杂了弄得都下不了手,看了别人的代码才明白),则该方格可以放,以DFS遍历所有方格找出最大解即可
#include<iostream>
#include<cstdio>
using namespace std;
char str[1010][1010];
int ans, n, tmp, t[1010][1010];
bool ok(int x, int cl)
{
for(int i = cl-1;i >= 0;i--){ //行判断
if(t[x][i] == 1){
return false;
}
if(str[x][i] == 'X'){
break;
}
}
for(int j = x-1;j >= 0;j--){ //列判断
if(t[j][cl] == 1){
return false;
}
if(str[j][cl] == 'X'){
break;
}
}
return true;
}
void dfs(int cur, int col)
{
if(cur == n){
if(tmp > ans){
ans = tmp;
}
return;
}
for(int i=col;i < n;i++){
if(str[cur][i] == '.' && ok(cur,i)){
t[cur][i] = 1; //设置标志
tmp++;
dfs(cur,i+1); //遍历cur行的所有方格
t[cur][i] = 0; // 取消标志
tmp--;
}
}
dfs(cur+1, 0); // 遍历下一行
}
int main()
{
//freopen("D://in.txt","r",stdin);
while(cin >> n,n){
for(int i=0;i < n;i++){
cin >> str[i];
}
ans = tmp = 0;
dfs(0,0);
cout << ans << endl;
}
return 0;
}