费解的开关

费解的开关

利用逆推,得出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";
    }
}
posted @ 2020-02-26 20:08  caoanda  阅读(116)  评论(0编辑  收藏  举报