费解的开关
利用逆推,得出6步之内可以得到的状态,剪枝之后,可以在规定时间内完成。
// Created by CAD on 2020/2/26.
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef pair<int,int> pii;
int dx[5]={0,1,-1,0,0};
int dy[5]={0,0,0,-1,1};
void fun(int x,int y,int &g){
if(x<0||x>=5||y<0||y>=5) return ;
g^=1<<(x*5+y);
}
unordered_map<int,int> ans;
queue<pii> q;
int main(){
q.push({(1<<25)-1,0});
ans[(1<<25)-1]=0;
while(!q.empty()){
pii now=q.front();q.pop();
for(int i=0;i<5;++i)
for(int j=0;j<5;++j){
int a=now.fi;
for(int k=0;k<=4;++k) fun(i+dx[k],j+dy[k], a);
if(!ans.count(a)){
ans[a]=now.se+1;
if(ans[a]<6) q.push({a, ans[a]});
}
}
}
int T;cin>>T;
while(T--){
int n=0;
for(int i=0;i<5;++i)
for(int j=0;j<5;++j){
int x;scanf("%1d",&x);
if(x) n|=1<<(i*5+j);
}
if(ans.count(n)) cout<<ans[n]<<"\n";
else cout<<-1<<"\n";
}
}
CAD加油!欢迎跟我一起讨论学习算法,QQ:1401650042