题目传送门:
https://vjudge.net/problem/ZOJ-2058
思路来自: https://blog.csdn.net/Ferko/article/details/79810380
思路来自: https://blog.csdn.net/Ferko/article/details/79810380
最大值:尽量多的往'?'中填充'@'并且要保证'@'和'*'号间隔出现,最终'@'的个数就是最大值;
最小值:尽量多的往'?'中填充 '*'并且要保证'@'和'*'号间隔出现,最终'@'的个数就是最大值;#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn =110;
int main()
{
int n;
char a[maxn][maxn];
char b[maxn][maxn];
while(scanf("%d\n",&n)&&n>0) //之前wa了8次,最后才发现错在少加了'\n'.
{
for(int i=1; i<=n; i++)
{
gets(b[i]+1);
}
memcpy(a,b,sizeof(b));
int max=0,min=0;
//求最大值
if(a[1][1]!='*')
a[1][1]='@';
for(int i=2; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
if(a[i][j]=='?')
{
if((j==0&&a[i][j+1]!='@')||(j==i-1&&a[i][j-1]!='@'))
{
a[i][j]='@';
}
else if(a[i][j+1]!='@'&&a[i][j-1]!='@')
{
a[i][j]='@';
}
else
a[i][j]='*';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(a[i][j]=='@')
max++;
}
}
//求最小值
if(b[1][1]!='@')
b[1][1]='*';
for(int i=2; i<=n; i++)
{
for(int j=1; j<=i; j++)
{
if(b[i][j]=='?')
{
if((j==0&&b[i][j+1]!='*')||(j==i-1&&b[i][j-1]!='*'))
{
b[i][j]='*';
}
else if(b[i][j+1]!='*'&&b[i][j-1]!='*')
{
b[i][j]='*';
}
else
b[i][j]='@';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(b[i][j]=='@')
min++;
}
}
cout<<max<<' '<<min<<endl;
}
}