1 条题解
-
0
写了个大方块还有救吗?
#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
- 上传者