递归回溯,枚举图中的所有位置,判断当前点能否放车,如果放置,vis标记为1;(这里和八皇后问题不同,即使在同行或者同列,有墙间隔,依然可以放置小车)
判断能否放置的方法参考代码中的judge函数;
#include <cstdio>
#include <cstring>
using namespace std;
#define minn -0x3f3f3f3f
int n, _min;
int vis[5][5];
char g[5][5];
void init(){
memset(vis, 0, sizeof(vis));
_min = minn;
}
bool judge(int x, int y){
for(int i = x-1; i >= 0; --i){ //judge row:
if(g[i][y] == 'X')
break;
if(vis[i][y])
return true;
}
for(int i = y-1; i >= 0; --i){ //judge column
if(g[x][i] == 'X')
break;
if(vis[x][i])
return true;
}
for(int i = y+1; i < n; ++i){
if(g[x][i] == 'X')
break;
if(vis[x][i])
return true;
}
return false;
}
void dfs(int x, int y, int cnt){
for(int i = x; i < n; ++i){
for(int j = 0; j < n; ++j){
if(!vis[i][j] && g[i][j] == '.' && !judge(i, j)){ //判断能否放 rook;
vis[i][j] = 1;
dfs(i, j, cnt+1);
vis[i][j] = 0; //回溯问题中,如果是全局变量大多要还原状态量(强调);
}
}
}
if(cnt > _min){
_min = cnt;
}
}
int main()
{
while(scanf("%d", &n) != EOF && n){
for(int i = 0; i < n; ++i){
scanf("%s", g[i]);
}
init();
dfs(0, 0, 0);
printf("%d\n", _min);
}
return 0;
}