链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1316
思路: 因为n 和m 并不会很大,所以就直接枚举>=r && >=c 的所有情况,然后将这些情况的结果算出来就可以。
枚举每个点对应的四个点是否被选中就可以。
这里有几种情况
代码:
#include<bits/stdc++.h>
using namespace std;
const int inf =0x3f3f3f;
const int N =10;
int a[N][N];
int rr,cc;
int n,m;
int yi[25];
int vis[10][10];
int hang[10];
int lie[10];
int ans;
char s[10];
void init_yi()
{
yi[0]=1;
for(int i=1; i<=21; i++)
yi[i]=yi[i-1]*2;
}
int jud(int cnt,int c0,int c1)
{
if(cnt==0) return 0;
if(cnt==1)
return 0;
if(cnt==2)
{
if(c0==0||c1==0)
return 0;
return 1;
}
if(cnt==3)
{
if(c0==3||c1==3)
return 0;
return 1;
}
if(cnt==4)
{
if(c0==4||c1==4)
return 0;
if(c0==1||c1==1)
return 1;
return 2;
}
}
void solve()
{
int x1,x2,x3,x4;
int y1,y2,y3,y4;
int up1=yi[n];
int up2=yi[m];
for(int s=0; s<up1; s++)
{
for(int s1=0; s1<up2; s1++)
{
memset(vis,0,sizeof(vis));
memset(hang,0,sizeof(hang));
memset(lie,0,sizeof(lie));
for(int k=0; k<n; k++)
{
if(s&yi[k])
hang[k+1]=1;
}
for(int k=0; k<m; k++)
{
if(s1&yi[k])
lie[k+1]=1;
}
int cnth=0,cntl=0;
for(int k=1; k<=n; k++)
{
if(hang[k])
cnth++;
}
for(int k=1;k<=m;k++){
if(lie[k])
cntl++;
}
if(cnth<rr||cntl<cc)
continue;
int tmp=0;
for(int k=1; k<=n; k++)
{
for(int kk=1; kk<=m; kk++)
{
if(hang[k]==0&&lie[kk]==0)
continue;
if(vis[k][kk])
continue;
x1=k; y1=kk;
x2=x1; y2=m+1-y1;
x3=n+1-x1; y3=y1;
x4=x3; y4=y2;
int cnt=0;
int c1=0,c0=0;
if(hang[x1]&&lie[y1])
{
if(vis[x1][y1]==0)
{
cnt++;
vis[x1][y1]=1;
if(a[x1][y1]==0)
c0++;
else
c1++;
}
if(vis[x2][y2]==0)
{
cnt++;
vis[x2][y2]=1;
if(a[x2][y2]==0)
c0++;
else
c1++;
}
if(vis[x3][y3]==0)
{
cnt++;
vis[x3][y3]=1;
if(a[x3][y3]==0)
c0++;
else
c1++;
}
if(vis[x4][y4]==0&&(hang[x4]||lie[y4]))
{
cnt++;
vis[x4][y4]=1;
if(a[x4][y4]==0)
c0++;
else
c1++;
}
}
else if(hang[x1])
{
if(vis[x1][y1]==0)
{
cnt++;
vis[x1][y1]=1;
if(a[x1][y1]==0)
c0++;
else
c1++;
}
if(vis[x2][y2]==0)
{
cnt++;
vis[x2][y2]=1;
if(a[x2][y2]==0)
c0++;
else
c1++;
}
if(lie[y2])
{
if(vis[x4][y4]==0)
{
cnt++;
vis[x4][y4]=1;
if(a[x4][y4]==0)
c0++;
else
c1++;
}
if(hang[x4])
{
if(vis[x3][y3]==0)
{
cnt++;
vis[x3][y3]=1;
if(a[x3][y3]==0)
c0++;
else
c1++;
}
}
}
}
else if(lie[y1])
{
if(vis[x1][y1]==0)
{
cnt++;
vis[x1][y1]=1;
if(a[x1][y1]==0)
c0++;
else
c1++;
}
if(vis[x3][y3]==0)
{
cnt++;
vis[x3][y3]=1;
if(a[x3][y3]==0)
c0++;
else
c1++;
}
if(hang[x3])
{
if(vis[x4][y4]==0)
{
cnt++;
vis[x4][y4]=1;
if(a[x4][y4]==0)
c0++;
else
c1++;
}
if(lie[y4])
{
if(vis[x2][y2]==0)
{
cnt++;
vis[x2][y2]=1;
if(a[x2][y2]==0)
c0++;
else
c1++;
}
}
}
}
tmp+=jud(cnt,c0,c1);
}
}
/*
if(tmp<ans){
cout<<"tmp "<<tmp<<endl;
cout<<"cnth "<<cnth<<" cntl "<<cntl<<endl;
printf("hang\n");
for(int k=1;k<=n;k++){
if(hang[k]) printf("%d ",k);
}
printf("\n");
printf("lie\n");
for(int kk=1;kk<=n;kk++){
if(lie[kk]) printf("%d ",kk);
}
printf("\n");
}
*/
ans=min(ans,tmp);
}
}
}
int main()
{
init_yi();
scanf("%d %d",&rr,&cc);
scanf("%d",&n);
for(int i=1; i<=n; i++)
{
scanf("%s",s+1);
m=strlen(s+1);
for(int j=1;j<=m;j++){
if(s[j]=='0') a[i][j]=0;
else a[i][j]=1;
}
}
ans=inf;
//cout<<ans<<endl;
solve();
printf("%d\n",ans);
return 0;
}
/*
1 3
6
0111
0111
0100
0101
1111
0000
1 1
2
01
10
3 2
4
0000
1000
1100
1110
*/