递归枚举所有可能的摆放方法,递归同时更新最多可以摆放的车的数量。
#include <stdio.h>
char arr[8][8];
int max_num;
int n;
void dfs(int row, int col, int cur_num)
{
bool f;
int i, j;
//越界的时候回溯
if(row==n+1)
return;
if(arr[row][col] == '.')
{
f = true;
for(j=col-1; j>=1; j--)
{
if(arr[row][j] == 'X')
break;
if(arr[row][j] == 'R')
{
f = false;
break;
}
}
if(f)
{
for(j=col+1; j<=n; j++)
{
if(arr[row][j] == 'X')
break;
if(arr[row][j] == 'R')
{
f = false;
break;
}
}
}
if(f)
{
for(i=row-1; i>=1; i--)
{
if(arr[i][col] == 'X')
break;
if(arr[i][col] == 'R')
{
f = false;
break;
}
}
}
if(f)
{
for(i=row+1; i<=n; i++)
{
if(arr[i][col] == 'X')
break;
if(arr[i][col] == 'R')
{
f = false;
break;
}
}
}
if(f)
{
arr[row][col] = 'R';
if(max_num < cur_num)
max_num = cur_num;
for(i=row; i<=n; i++)
{
if(i == row)
{
for(j=col+1; j<=n; j++)
dfs(i, j, cur_num+1);
}
else
{
for(j=0; j<=n; j++)
dfs(i, j, cur_num+1);
}
}
}
}
if(arr[row][col] == 'R')
arr[row][col] = '.';
}
void func(int n)
{
int i, j;
max_num = 0;
::n = n;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
dfs(i, j, 1);
}
}
printf("%d\n", max_num);
}
int main(void)
{
int n;
int i, j;
//freopen("input.dat", "r", stdin);
while(1)
{
scanf("%d", &n);
getchar();
if(!n)
break;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
scanf("%c", arr[i]+j);
getchar();
}
func(n);
}
return 0;
}