1 条题解

  • 0
    @ 2026-7-4 10:57:56

    写了个大方块还有救吗?

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1010,inf=0x3f3f3f3f;
    int a[N][N],dp[N][2][2],n,m;
    bool check(int x,int f1,int f2,int f3)
    {
    	for(int i=1;i<=m;i++)
    		if(((x-1==1)||((a[x-2][i]^f3)!=(a[x-1][i]^f2)))&&(i==1||a[x-1][i-1]!=a[x-1][i])&&(i==m||a[x-1][i+1]!=a[x-1][i])&&((x==n+1)||((a[x-1][i]^f2)!=(a[x][i]^f1))))
    			return 0;
    	return 1;
    }
    signed main()
    {
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>a[i][j];
    	memset(dp,0x3f,sizeof(dp));dp[1][0][0]=0,dp[1][1][0]=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(check(i,0,0,0))dp[i][0][0]=min(dp[i][0][0],dp[i-1][0][0]);
    		if(check(i,0,0,1))dp[i][0][0]=min(dp[i][0][0],dp[i-1][0][1]);
    		if(check(i,0,1,0))dp[i][0][1]=min(dp[i][0][1],dp[i-1][1][0]);
    		if(check(i,0,1,1))dp[i][0][1]=min(dp[i][0][1],dp[i-1][1][1]);
    		if(check(i,1,0,0))dp[i][1][0]=min(dp[i][1][0],dp[i-1][0][0]+1);
    		if(check(i,1,0,1))dp[i][1][0]=min(dp[i][1][0],dp[i-1][0][1]+1);
    		if(check(i,1,1,0))dp[i][1][1]=min(dp[i][1][1],dp[i-1][1][0]+1);
    		if(check(i,1,1,1))dp[i][1][1]=min(dp[i][1][1],dp[i-1][1][1]+1);
    	}
    	int ans=inf;
    	if(check(n+1,0,0,0))ans=min(ans,dp[n][0][0]);
    	if(check(n+1,0,0,1))ans=min(ans,dp[n][0][1]);
    	if(check(n+1,0,1,0))ans=min(ans,dp[n][1][0]);
    	if(check(n+1,0,1,1))ans=min(ans,dp[n][1][1]);
    	cout<<(ans==inf?-1:ans);
    	return 0;
    }
    • 1

    信息

    ID
    7012
    时间
    2000ms
    内存
    1024MiB
    难度
    10
    标签
    递交数
    9
    已通过
    2
    上传者