/*
* 题意:在方格中摆放机器守卫,机器守卫之间
* 不能同行或同列,除非有墙挡着,题目中用X
* 表示,机枪只能摆在空闲的地方,用.表示,
* 求最多能放多少个机器守卫,和N皇后问题有
* 点像。。。
*
* 思路:简单的暴力dfs,怎样暴力自己喜欢,
* 下面是代码
*
*/
#include<stdio.h>
#include<string.h>
char dp[10][10];
int vis[10][10],n,res;
int judge(int n,int m) /**判断n行m列这个点能否放置*/
{
int i;
for(i=n;i>=1;i--)
{
if(dp[i][m]=='X')
break;
else if(vis[i][m])
return 0;
}
for(i=m;i>=1;i--)
{
if(dp[n][i]=='X')
break;
else if(vis[n][i])
return 0;
}
return 1;
}
void dfs(int x,int y,int set)
{
if(x==n+1)
return ;
if(y==n+1)
dfs(x+1,1,set);
if(judge(x,y)&&dp[x][y]=='.'&&!vis[x][y])
{
vis[x][y]=1;
if(set+1>res)
res=set+1;
dfs(x,y+1,set+1);
vis[x][y]=0;
}
if(y<=n||dp[x][y]=='X')
dfs(x,y+1,set);
}
int main()
{
while(scanf("%d",&n)&&n)
{
int i,j;
res=0;
memset(vis,0,sizeof(vis));
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("\n%c",&dp[i][j]);
dfs(1,1,0);
printf("%d\n",res);
}
return 0;
}
ZOJ 1002(Fire Net)
最新推荐文章于 2021-02-16 20:41:44 发布