回旋ACAG 0x02-4スイッチ

回旋ACAG 0x02-4スイッチ

この質問のために、私たちは次のプロパティを見つけます:

  1. それぞれの場所は、多くの時間とクリックされました。
  2. 結果には影響しませんオーダーをクリックします。
  3. それが最初に判断された場合、\(1 \)あなたが唯一のプログラムをクリックすることができる横、行を\(1 \)種。具体的な理由:最初のとき\(I \)ラインビットに(0 \)\、フロントこの時間\(I \)行が決定されている、我々は最初だけをクリックすることができます\(I + 1 \)のライン第一にするために位置の数\(I \)このビット線となる\(1 \)
    そこで、我々は単に検討する方法のニーズの最初の行をクリックしてください。列挙の合計を取得することは難しいことではありません\(32 \)種。我々は使用することができます(0 \)\\(31 \)バイナリ表現クリック方法を。
    次に、各メソッドのために、我々は次の配信を起動することができます\(2 \) \(5 \)メソッドライン、最後のチェックをクリックしてください。全体の行列になる場合は、\(1 \) それはプログラムが正当であることを示しています。そして、その答えを更新します。
    また、検査時に、ちょうど最後のチェック\(1 \)ラインをすることができます。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
 
using namespace std;
 
int n,ans,tmp;
int a[7][7],b[7][7];
char s[7];
 
void Read() {
    for(int i=1;i<=5;i++) {
        cin>>(s+1);
        for(int j=1;j<=5;j++)  {
            a[i][j]=s[j]-'0';
        }
    }
    ans=INF;
    return;
}
 
void Init() {
    for(int i=1;i<=5;i++) {
        for(int j=1;j<=5;j++) {
            b[i][j]=a[i][j];
        }
    }
    tmp=0;
    return;
}
 
void Change(int x,int y) {
    b[x][y]==1?b[x][y]=0:b[x][y]=1;
    b[x][y-1]==1?b[x][y-1]=0:b[x][y-1]=1;
    b[x][y+1]==1?b[x][y+1]=0:b[x][y+1]=1;
    b[x-1][y]==1?b[x-1][y]=0:b[x-1][y]=1;
    b[x+1][y]==1?b[x+1][y]=0:b[x+1][y]=1;
    tmp++;
    return;
}
 
bool Check() {
    if(tmp>6) {
        return false;
    }
    for(int i=1;i<=5;i++) {
        if(b[5][i]==0) {
            return false;
        }
    }
    return true;
}
 
void DFS(int x) {
    if(x==6) {
        if(Check()) {
            ans=min(ans,tmp);
        }
        return;
    }
    for(int i=1;i<=5;i++) {
        if(b[x-1][i]==0) {
            Change(x,i);
        }
    }
    DFS(x+1);
}
 
void Solve() {
    for(int i=0;i<=31;i++) {
        Init();
        for(int j=0;j<=4;j++) {
            int x=(i>>j)&1;
            if(x) {
                Change(1,j+1);
            }
        }
        DFS(2);
    }
    printf("%d\n",ans==INF?-1:ans);
    return;
}
 
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        Read();
        Solve();
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/luoshui-tianyi/p/11917954.html