zoukankan      html  css  js  c++  java
  • hdu5012 水搜索

    题意:
          给你一个正方体的初始状态和末状态,问你是否可以再6步之内转到这个状态,有四种转的方式,如果你面对的是正方向的正前方,那么转的方式就是 顺时针,逆时针,上,下。

    思路: 

          水搜索,直接搜就行,深搜广搜随意,mark不mark也随意,因为状态4,深度6那么最多也就4^6,题目没有坑点,细心点就行了,我写的是一个广搜(mark了)。


    #include<stdio.h>
    #include<queue>
    
    using namespace std;
    
    typedef struct
    {
       int now[7];
    }NODE;
    
    NODE xin ,tou;
    int mark[7][7][7][7][7][7];
    int ss[7] ,ee[7];
    
    int BFS()
    {
       memset(mark ,0 ,sizeof(mark));
       mark[ss[1]][ss[2]][ss[3]][ss[4]][ss[5]][ss[6]] = 1;
       queue<NODE>q; 
       for(int i = 0 ;i <= 6 ;i ++) xin.now[i] = ss[i];    
       q.push(xin);
       while(!q.empty())
       {
          tou = q.front();
          q.pop();
          int ok = 1;
          for(int i = 1 ;i <= 6 ;i ++) 
          if(tou.now[i] != ee[i]) ok = 0;
          if(ok) return tou.now[0];  
          if(tou.now[0] >= 6) continue;
          
          for(int i = 0 ;i <= 6 ;i ++) xin.now[i] = tou.now[i];
          xin.now[0] ++;
          xin.now[1] = tou.now[3] ,xin.now[3] = tou.now[2] ,xin.now[2] = tou.now[4] ,xin.now[4] = tou.now[1];
          if(!mark[xin.now[1]][xin.now[2]][xin.now[3]][xin.now[4]][xin.now[5]][xin.now[6]] ) q.push(xin);
          
          for(int i = 0 ;i <= 6 ;i ++) xin.now[i] = tou.now[i];
          xin.now[0] ++;
          xin.now[1] = tou.now[4] ,xin.now[4] = tou.now[2] ,xin.now[2] = tou.now[3] ,xin.now[3] = tou.now[1];
          if(!mark[xin.now[1]][xin.now[2]][xin.now[3]][xin.now[4]][xin.now[5]][xin.now[6]] ) q.push(xin);
          
          for(int i = 0 ;i <= 6 ;i ++) xin.now[i] = tou.now[i];
          xin.now[0] ++;
          xin.now[1] = tou.now[5] ,xin.now[5] = tou.now[2] ,xin.now[2] = tou.now[6] ,xin.now[6] = tou.now[1];
          if(!mark[xin.now[1]][xin.now[2]][xin.now[3]][xin.now[4]][xin.now[5]][xin.now[6]] ) q.push(xin);      
       
          for(int i = 0 ;i <= 6 ;i ++) xin.now[i] = tou.now[i];
          xin.now[0] ++;
          xin.now[1] = tou.now[6] ,xin.now[6] = tou.now[2] ,xin.now[2] = tou.now[5] ,xin.now[5] = tou.now[1];
          if(!mark[xin.now[1]][xin.now[2]][xin.now[3]][xin.now[4]][xin.now[5]][xin.now[6]] ) q.push(xin);
    
       }
       return -1;
    }
    
    int main ()
    {
       while(~scanf("%d %d %d %d %d %d" ,&ss[1] ,&ss[2] ,&ss[3] ,&ss[4] ,&ss[5] ,&ss[6]))
       { 
          for(int i = 1 ;i <= 6 ;i ++)
          scanf("%d" ,&ee[i]);
          ss[0] = ee[0] = 0;
          printf("%d
    " ,BFS());
       }
       return 0;
    }
    

  • 相关阅读:
    细说VMWare加入OpenStack
    云计算和大数据的崛起
    HTML5 Web app开发工具Kendo UI Web教程:如何配置Kendo UI Calendar
    Android:增强目录选择器对话框
    Gartner指明2014年几大战略技术趋势
    Android开发人员终于在“app-构建控制台”中获得分析
    谷歌升级Android分析应用程序
    Android是Windows开发人员可选择的下一个平台
    Greek
    为什么质数有无穷多个
  • 原文地址:https://www.cnblogs.com/csnd/p/12062785.html
Copyright © 2011-2022 走看看