//hdu 1045 Fire Net(主要用到dfs)
/*
题意:大概意思就是:给你一张n*n的图;
只有城墙和空道,然后样在空地放房子,并且房子不对相对面;
求最多放多少个房子。
题解:dfs式暴力回溯可以:
关键是怎么dfs;
要在构一个数据图,为了更好的回溯,和判断这是否可以再放房子来防止相对面。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=10;
char ma[N][N];//图
int nma[N][N];
bool flag[N][N];
int n;
int ansmax;
void maup(int ti,int tj)//给你一个点,对所有上下左右都进行数据相加,来防止房子产生对面
{
flag[ti][tj]=true;
nma[ti][tj]++;
for(int i=1;i<n;i++)
{
if(ti+i>=n||ma[ti+i][tj]=='X')
{
break;
}
nma[ti+i][tj]++;
}
for(int i=1;i<n;i++)
{
if(ti-i<0||ma[ti-i][tj]=='X')
{
break;
}
nma[ti-i][tj]++;
}
for(int i=1;i<n;i++)
{
if(tj+i>=n||ma[ti][tj+i]=='X')
{
break;
}
nma[ti][tj+i]++;
}
for(int i=1;i<n;i++)
{
if(tj-i<0||ma[ti][tj-i]=='X')
{
break;
}
nma[ti][tj-i]++;
}
}
void madown(int ti,int tj)//回溯上面数据
{
for(int i=1;i<n;i++)
{
if(tj-i<0||ma[ti][tj-i]=='X')
{
break;
}
nma[ti][tj-i]--;
}
for(int i=1;i<n;i++)
{
if(tj+i>=n||ma[ti][tj+i]=='X')
{
break;
}
nma[ti][tj+i]--;
}
for(int i=1;i<n;i++)
{
if(ti-i<0||ma[ti-i][tj]=='X')
{
break;
}
nma[ti-i][tj]--;
}
for(int i=1;i<n;i++)
{
if(ti+i>=n||ma[ti+i][tj]=='X')
{
break;
}
nma[ti+i][tj]--;
}
nma[ti][tj]--;
flag[ti][tj]=false;
}
void dfs(int ti,int tj,int v)//暴力搜索回溯找出最多房子
{
maup(ti,tj);
//=============================
if(ansmax<v)
{
ansmax=v;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(ma[i][j]=='.'&&nma[i][j]==0&&flag[i][j]==false)
{
dfs(i,j,v+1);
}
}
}
//============================
madown(ti,tj);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=0;i<n;i++)
{
scanf("%s",ma[i]);
}
memset(flag,false,sizeof(flag));
memset(nma,0,sizeof(nma));
ansmax=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(ma[i][j]=='.')
{
dfs(i,j,1);
}
}
}
printf("%d\n",ansmax);
}
return 0;
}
/hdu 1045 Fire Net(主要用到dfs)
最新推荐文章于 2020-12-17 01:22:32 发布