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;
    }
    

  • 相关阅读:
    java虚拟机之类加载机制
    java虚拟机之垃圾收集器
    java虚拟机之内存模型
    java基础之NIO
    java基础之字符串
    Integer.valueOf源码分析
    将博客搬至CSDN
    url中向后台传递参数中文乱码
    Layui主窗口和Iframe层参数传递
    百度地图Api 加载海量点
  • 原文地址:https://www.cnblogs.com/csnd/p/12062785.html
Copyright © 2011-2022 走看看