zoukankan      html  css  js  c++  java
  • BFS + 状态压缩 POJ 2965 The Pilots Brothers' refrigerator

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    
    using namespace std;
    
    char c;
    
    int m;
    
    int sp[999999];
    
    struct Q
    {
        int sta,ans,r,c,pre;
    } q[999999],t,t1;
    
    int top = 0,sum = 999999;
    
    bool vis[65536];
    
    void search(int site,int sta,int ans)
    {
        int s = 0,e = 0;
        q[e].r = q[e].c = q[e].pre = -1;
        q[e].sta = sta;
        q[e++].ans = ans;
    
        vis[sta] = true;
    
        int i,j;
    
        while(s != e)
        {
            t1 = q[s++];
            if(t1.sta == 65535)
            {
                sum = t1.ans;
                m = s-1;
                return;
            }
            for(i = 1; i <= 4; i++)
                for(j = 1; j <= 4; j++)
                {
                    t = t1;
                    for(site = i*4-3; site <= i*4; site++)
                    {
                        t.sta ^= (1<< (site-1));
                    }
                    site = j%4;
                    if(site == 0)
                        site = 4;
                    for(; site <= 16; site += 4)
                    {
                        t.sta ^= (1<< (site-1));
                    }
    
                    t.sta ^= (1<< i*4+j-5);
    
                    if(vis[t.sta] == false)
                    {
                        t.ans++;
                        q[e] = t;
                        q[e].pre = s-1;
    
                        q[e].r = i;
                        q[e++].c = j;
                        vis[t.sta] = true;
                    }
                }
        }
    }
    
    void output_path(int m)//递归输出路径
    {
        if(q[m].pre == -1)
            return;
        output_path(q[m].pre);
        printf("%d %d
    ",q[m].r,q[m].c);
    }
    
    int main()
    {
        int i,j;
    
        char s[10];
    
        sum = 999999;
    
        memset(vis,false,sizeof(vis));
    
        int t;
    
        for(m = 0,t = 1,i = 0; i < 4; i++)
        {
            scanf("%s",s);
            for(j = 0; j < 4; j++)
            {
                if(s[j] == '-')
                    m += t;
                t *= 2;
            }
    
        }
    
        search(1,m,0);
    
        cout<<sum<<endl;
    
        output_path(m);
    
        return 0;
    }
  • 相关阅读:
    C# 利用ffmpeg 对视频转换系类操作 (1) 基本分析
    对象的行为
    类、对象、包
    java中的程序流程控制
    季节
    好的博客网址
    大家好 希望大家多多帮助
    Android 4.4 安卓系统突破限制让所有应用程序可操作外置SD卡
    STL笔记:函数配接器(Function adapters)
    STL中仿函数的简要回顾
  • 原文地址:https://www.cnblogs.com/zmx354/p/3223980.html
Copyright © 2011-2022 走看看