题目大意:类似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;
}