1 条题解

  • 0
    @ 2025-10-8 17:01:55

    by hansang:

    #include<bits/stdc++.h>
    using namespace std;
    const int N=16;
    int a[N][N], n, m, b[N][N], c[N][N], a1[N][N];
    int dx[5]={0, -1, 1, 0, 0};
    int dy[5]={0, 0, 0, -1, 1};
    void change(int x, int y){
        for(int i=0; i<5; i++){
            int tx=x+dx[i], ty=y+dy[i];
            if(tx>=1 && tx<=n && ty>=1 && ty<=m){
                a[tx][ty]^=1;
            }
        }
    }
    int main(){
        scanf("%d%d", &n, &m);
        for(int i=1; i<=n; i++) for(int j=1; j<=m; j++){
            scanf("%d", &a[i][j]); a1[i][j]=a[i][j];
        }
        int ans=1e9;
        for(int i1=0; i1<(1<<m); i1++){
            memset(b, 0, sizeof(b)); int sum=0;
            memcpy(a, a1, sizeof(a));
            for(int j=1; j<=m; j++) if((1<<(j-1))&i1){
                change(1, j); 
                b[1][j]++; sum++;
            }
            for(int i=1; i<n; i++){
                for(int j=1; j<=m; j++) if(a[i][j]){
                    change(i+1, j); 
                    b[i+1][j]++; sum++;
                }
            }
            bool flag=1;
            for(int i=1; i<=m; i++) if(a[n][i]){
                flag=0; break;
            }
            if(ans>sum && flag){
                ans=sum;
                memcpy(c, b, sizeof(b));
            }
        }
        if(ans==1e9) printf("IMPOSSIBLE\n");
        else{
            for(int i=1; i<=n; i++){
                for(int j=1; j<=m; j++)
                    printf("%d ", c[i][j]);
                printf("\n");
            }
        }
        return 0;
    }
    
    • 1

    【穷举+状压】[USACO07OPEN] 翻转棋 Fliptile S

    信息

    ID
    2633
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    8
    已通过
    5
    上传者