码迷,mamicode.com
首页 > 其他好文 > 详细

费解的开关

时间:2020-02-26 21:10:53      阅读:100      评论:0      收藏:0      [点我收藏+]

标签:tps   oid   map   --   std   using   http   names   front   

费解的开关

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

费解的开关

标签:tps   oid   map   --   std   using   http   names   front   

原文地址:https://www.cnblogs.com/CADCADCAD/p/12368759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!