题意:给出n * n 的格子,放车,根据象棋的规则,如果车在同排或同列也有车的话可以吃掉,所以题目要求格子内最多能放几个车并且能不互相攻击,增加了一个特殊点就是如果同排同列内有多个车,但是都有 'X' 隔开,也可以存在。
题解:递归并回溯,如果位置是 '.' 并且判断可以放车,就将 '.' 换为 '#',递归结束后,再将'#'重新还原为 '.',不影响其他情况,运用了回溯的思想。
#include <stdio.h>
const int N = 5;
char s[N][N];
int maxx, n;
int judge(int x, int y) {
for (int i = x - 1; i >= 0; i--)
if (s[i][y] == '#')//同排没有墙且有车
return 0;
else if (s[i][y] == 'X')//有墙
break;
for (int j = y - 1; j >= 0; j--)
if (s[x][j] == '#')//同列没有墙且有车
return 0;
else if (s[x][j] == 'X')//有墙
break;
return 1;
}
void search(int x, int y, int count) {
while (x < n) {
if (y < n && s[x][y] == '.' && judge(x, y)) {
s[x][y] = '#';
search(x, y + 1, count + 1);
s[x][y] = '.';//还原
}
if (y >= n) {
x++;
y = 0;
}
else
y++;
}
if (count > maxx)
maxx = count;
}
int main() {
while (scanf("%d", &n) && n) {
maxx = -1;
for (int i = 0; i < n; i++)
scanf("%s", s[i]);
search(0, 0, 0);
printf("%d\n", maxx);
}
return 0;
}