题目大意:类似8皇后问题,不能放在同行同列,只不过这题多了些墙而已,墙可以把行列分成两部分,左右两边不影响
解题思路:讲“X”设置为0,将“.” 设置为1,把车放下去的地方设置为-1,如果遇到‘.’就进行判断,因为是从左上角开始遍历的,所以要向上和向左进行判断,如果遇到个-1就退出,返回false,表示此行或者此列已经放了一个了,不能再放了,遇到0,即为墙就break,跳出该行或该列的判断,向左向上遍历完后,发现符合要求的话,就返回true,然后将该点设置为-1,判断继续判断下一个点,以此类推,判断完后要将其还原为1
#include<cstdio>
#include<cstdlib>
#include<cstring>
int p[5][5];
int num;
bool rock(int r, int c) {
for(int i = r; i >= 0; i--) {
if(p[i][c] < 0)
return false;
else if(!p[i][c])
break;
}
for(int i = c; i >= 0; i--)
if(p[r][i] < 0)
return false;
else if(!p[r][i])
break;
return true;
}
int dfs(int i, int j) {
int c = 0;
int max = 0;
while(i < num) {
if(p[i][j] && rock(i,j) ) {
p[i][j] = - 1;
c = dfs(i,j+1) + 1;
if(c > max)
max = c;
p[i][j] = 1;
}
if(j >= num - 1) {
i++;
j = 0;
}
else
j++;
}
return max;
}
int main() {
char c;
while(scanf("%d", &num) != EOF && num) {
getchar();
memset(p,0,sizeof(p));
for(int i = 0; i < num; i++) {
for(int j = 0; j < num; j++) {
scanf("%c",&c);
if(c == '.') {
p[i][j] = 1;
}
}
getchar();
}
printf("%d\n",dfs(0,0));
}
return 0;
}