费解的开关

Posted cadcadcad

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了费解的开关相关的知识,希望对你有一定的参考价值。

费解的开关

利用逆推,得出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]<<"
";
        else cout<<-1<<"
";
    }
}

以上是关于费解的开关的主要内容,如果未能解决你的问题,请参考以下文章

费解的开关

题解AcWing95费解的开关

[VIJOS1197] 费解的开关

费解的开关

费解的开关

《算法竞赛进阶指南》-AcWing-95. 费解的开关-题解