我的方法是贪心,每次求能炸最多的地方。
样例全过,对拍的std有锅,实在调不出来了,求大佬看看!qwq
#include<iostream>
#include<cstdio>
using namespace std;
bool a[20][20];
int n,m;
bool getc()//字符读入
{
char a=getchar();
if(a!='#'&&a!='.')a=getchar();
if(a=='#')return false;
if(a=='.')return true;
}
int count(int x,int y)//数能炸多少墙
{
int ans=0;
for(int i=1; i<=n; i++)
{
if(a[i][y]==0)ans++;
}
for(int i=1; i<=m; i++)
{
if(a[x][i]==0)ans++;
}
return ans;
}
void bomb(int x,int y)//炸掉
{
for(int i=1; i<=n; i++)
{
a[i][y]=1;
}
for(int i=1; i<=m; i++)
{
a[x][i]=1;
}
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
a[i][j]=getc();
bool tmp=true;
int mx=0,maxx=0,maxy=0;
int p;
for(p=0; tmp; p++)
{
tmp=false,mx=0,maxx=0,maxy=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
if(a[i][j]==1)
{
tmp=true;
int z=count(i,j);
if(z>mx)mx=z,maxx=i,maxy=j;
//cout<<"..."<<i<<" "<<j<<":"<<z<<endl;
}
}
if(mx==0)break;//没有墙了
bomb(maxx,maxy);
//cout<<maxx<<" "<<maxy<<endl;
}
if(tmp)
cout<<p<<endl;
else cout<<-1<<endl;
return 0;
}