回旋ACAG 0x02-4スイッチ
この質問のために、私たちは次のプロパティを見つけます:
- それぞれの場所は、多くの時間とクリックされました。
- 結果には影響しませんオーダーをクリックします。
- それが最初に判断された場合、\(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;
}