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

  • 相关阅读:
    Windows 下Nexus搭建Maven私服
    WebService中获取request对象一例
    利用window.navigator.userAgent判断当前是否微信内置浏览器
    批量插入写法
    MySql 使用递归函数时遇到的级联删除问题
    【Mysql】 你会用 information_schema吗?
    Volatile 多线程中用到的关键字
    spring+springMVC中使用@Transcational方式管理事务的必须要配的东西。
    Android中操作SQLite数据库
    Oracle中的字符处理方法
  • 原文地址:https://www.cnblogs.com/csnd/p/12062785.html
Copyright © 2011-2022 走看看