The Pilots Brothers' refrigerator

题目地址

题解

我是蒟蒻,所以我只会打一个暴力。

这道题就是状压+暴力Bfs,(~~连双向Bfs优化都不用,跟别说A*什么的了~~)

Code

#include<bits/stdc++.h>
#define MAXBIT 150007
using namespace std;
bool vis[MAXBIT];
struct Node {
    int state,step;
};
struct Pre {
    int state,x,y;
}pre[MAXBIT];
void print_ans(int state) {
    if(pre[state].state==-1) {
        return ;
    }
    print_ans(pre[state].state);
    printf("%d %d\n",pre[state].x,pre[state].y);
}
void Bfs(int s,int t) { //Ô´µã£¬ÖÕµã 
    if(s==0) {
        puts("0");
        return ;
    }
    queue<Node> q; int val[5][5],tmp[5][5]; //tp=tempÊÇÁÙʱÊý×é 
    vis[s] = 1; q.push((Node){s,0});
    while(!q.empty()) {
        int now = q.front().state ,step = q.front().step; q.pop();
        memset(val,0,sizeof(val));
        int tmpnow = now;
        for(int i=4;i>=1;--i)
            for(int j=4;j>=1;--j) {
                val[i][j] = tmpnow & 1; tmpnow >>= 1;
            }
        //test
            
        for(int x=1;x<=4;++x) for(int y=1;y<=4;++y) {
            memset(tmp,0,sizeof(tmp));
            for(int i=1;i<=4;++i)
                for(int j=1;j<=4;++j)
                    tmp[i][j] = val[i][j];
            for(int i=1;i<=4;++i) {
                tmp[x][i] ^= 1; tmp[i][y] ^= 1;
            }
            tmp[x][y] ^= 1;
            int nst = 0;    //new state
            for(int i=1;i<=4;++i) for(int j=1;j<=4;++j) {
                nst = (nst<<1) + tmp[i][j];
            }
            if(!vis[nst]) {
                vis[nst] = 1; pre[nst].state = now; pre[nst].x = x; pre[nst].y = y;
                q.push((Node){nst,step+1});
            }
            if(nst == 0) {
                printf("%d\n",step+1);
                print_ans(nst);
                return ;
            }
        }
    }
}
int main()
{
    char ch; int s=0;
    for(int i=1;i<=4;++i)
        for(int j=1;j<=4;++j) {
            scanf(" %c",&ch); s = (s<<1) + (ch=='+' ? 1 : 0);   //Ä¿±ê¾ÍÊÇȫΪÁã
        }
    pre[s].state = -1;
    Bfs(s,0);
    return 0;
}
全部评论

相关推荐

沉淀一会:**圣经 1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务