整体思路就是dfs,我觉得就是从第一个位置开始尝试放置火力点,如果可以放就继续向下深搜,搜索完毕后回溯!如果不可以就直接递归的判断下一个位置,就这样不断递归下去就能考虑到所有情况,而且还要比穷举快很多!
#include<stdio.h>
#include<stdlib.h>
#define SIZE 4
int n;
int max;
int ret(char str[][SIZE],int k);
void work(char str[][SIZE],int k,int now);
int main()
{
scanf("%d",&n);
getchar();
while(n!=0)
{
int i,j;
char map[SIZE][SIZE];
max = 0;
for(i = 0;i < n;i++)
{
for(j = 0;j < n;j++)
scanf("%c",&map[i][j]);
getchar();
}
work(map,0,0);
printf("%d\n",max);
scanf("%d",&n);
getchar();
}
return 0;
}
int ret(char str[][SIZE],int k)
{
int i,flag = 1;
int a,b;
a = k / n;
b = k % n;
for(i = a - 1;i>=0;i--)
if(str[i][b]!='.')
{
if(str[i][b]=='D')
flag = 0;
break;
}
for(i = b - 1;i>=0;i--)
if(str[a][i]!='.')
{
if(str[a][i]=='D')
flag = 0;
break;
}
return flag;
}
void work(char str[][SIZE],int k,int now)
{
int a,b;
a = k / n;
b = k % n;
max = now>max?now:max;
if(k<n*n)
{
if(str[a][b]!='X'&&ret(str,k))
{
str[a][b] = 'D';
work(str,k+1,now+1);
str[a][b] = '.';
}
work(str,k+1,now);
}
}
具体实现上,我是用二维数组储存,然后用全局变量max保存最大火力点数,不断更新就可以了。