题目大意:有w*w的棋盘,每个方格为1(黑色)或0(白色),若棋盘的黑色格子数目c1(或白色格子c0)占总格子数的比例>=t;将所有格子都变为黑色(白色),否则,将棋盘均分为四个部分,继续进行上述判断;
思路:简单的dfs;
#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int w;
double t;
char a[100][100];
void dfs(int x0,int y0,int len)
{
int xx[4]={0,0,len/2,len/2};
int yy[4]={0,len/2,0,len/2};
int c0=0,c1=0;
for(int i=x0;i<x0+len;i++)
{
for(int j=y0;j<y0+len;j++)
{
if(a[i][j]=='0')c0++;
else c1++;
}
}
if(1.0*c0*100/(c0+c1)>=t)
{
for(int i=x0;i<x0+len;i++)//计算概率时不要忘乘100
{
for(int j=y0;j<y0+len;j++)a[i][j]='0';
}
}
else if(1.0*c1*100/(c0+c1)>=t)
{
for(int i=x0;i<x0+len;i++)
{
for(int j=y0;j<y0+len;j++)a[i][j]='1';
}
}
else
{
for(int p=0;p<4;p++)
dfs(x0+xx[p],y0+yy[p],len/2);
}
return ;
}
int main()
{
int cn=0;
while(cin>>w)
{
if(w==0)break;
cin>>t;
for(int i=0;i<w;i++)
{
cin>>a[i];//输入用字符串
}
dfs(0,0,w);
cout<<"Image "<<++cn<<":"<<endl;
for(int i=0;i<w;i++)
{
for(int j=0;j<w;j++)
{
cout<<a[i][j];
}
cout<<endl;
}
}
return 0;
}