链接
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2459
题解
枚举第一行,递推出剩下的行,然后验证,时间复杂度
这题写出来
,
半小时,原来是因为我边界没有处理好,多组数据没有清空数组QwQ
代码
//枚举
#include <cstdio>
#include <algorithm>
#define maxn 20
#define inf 0x3f3f3f3f
using namespace std;
int T, n, ans, a[maxn][maxn], b[maxn][maxn], cost;
void update(int t)
{
int i, j;
for(i=1;i<=n;i++)b[1][i]=t&1, t>>=1;
for(i=0;i<=n+1;i++)b[0][i]=b[n+1][i]=b[i][0]=b[i][n+1]=0;
for(i=2;i<=n;i++)for(j=1;j<=n;j++)b[i][j]=b[i-1][j-1]^b[i-1][j+1]^b[i-2][j];
for(i=1;i<=n;i++)for(j=1;j<=n;j++)
if(b[i+1][j]^b[i][j-1]^b[i][j+1]^b[i-1][j])return;
cost=0;
for(i=1;i<=n;i++)for(j=1;j<=n;j++)
{
if(a[i][j]==1 and b[i][j]==0)return;
if(a[i][j]==0 and b[i][j]==1)cost++;
}
ans=min(ans,cost);
}
int main()
{
int i, j, c, t;
scanf("%d",&T);
for(c=1;c<=T;c++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%d",a[i]+j);
ans=inf;
for(t=0;t<1<<n;t++)update(t);
printf("Case %d: ",c);
if(ans==inf)printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}