• Uva 10085 The most distant state


    Problem A The Most Distant State

    Input: standard input Output: standard output

    Time limit: 13.333 seconds

    解题思路:题目的意思是给你一个初始化的3*3 “数字拼图”,叫你找出需要移动步数最多的那个拼图的情形,而且输出移动的步骤,当然移动步数最多的比较是建立在不同的拼图情形上的。题目为特判,所以输出可能有所不同。解题思路用BFS放队列里扫描“数字拼图”中空白处的上下左右方向,将拼图中数换回位数为9位的大整数,所以共有9!个整数,有出现的将其放到set中,并不断更新移动步骤的长度和当前的拼图情形,判断set中元素的个数是否达到9!break出来输出更新后的目标拼图情形和移动步骤

     

      1 #include<iostream>
      2 #include<string>
      3 #include<cstring>
      4 #include<queue>
      5 #include<set>
      6 #define SIZE 9
      7 #define INF 362880
      8 #define MAXN 1000000
      9 using namespace std;
     10 
     11 typedef int subType[SIZE];
     12 typedef struct type{
     13     subType value;
     14     string step;
     15 }type;
     16 
     17 set<int>visit;
     18 queue<type>puzzle;
     19 
     20 int dir[][2] = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}};
     21 string dirFlag[] = {"L", "R", "U", "D"};
     22 int store_cnt;
     23 int store_num;
     24 string store_string;
     25 bool try_to_insert(type from)
     26 {
     27     int sum = 0;
     28     for(int i=0; i<SIZE; ++i) sum = sum*10 + from.value[i];
     29     if(visit.count(sum) == 0)
     30     {
     31         visit.insert(sum);
     32         if(store_string.length() <= from.step.length())
     33         {
     34             store_num = sum;
     35             store_string.assign(from.step);
     36         }
     37         store_cnt++;
     38         return true;
     39     }
     40     return false;
     41 }
     42 
     43 void Traverse()
     44 {
     45     visit.clear();
     46     store_cnt = 0;
     47     store_string = "\0";
     48     store_num = 0;
     49     try_to_insert(puzzle.front());
     50     while(!puzzle.empty())
     51     {    
     52         type cur = puzzle.front();
     53         puzzle.pop();
     54         subType& s = cur.value;
     55         int z=0;
     56         for(; z<SIZE && s[z] != 0; ++z);
     57         int x=z/3, y = z%3;
     58         int flag = 0;
     59         for(int d=0; d<4; ++d)
     60         {
     61             int newx = x + dir[d][0];
     62             int newy = y + dir[d][1];
     63             int newz = newx * 3 + newy;
     64             if(newx>=0 && newx < 3 && newy >=0 && newy < 3)
     65             {
     66                 type next;
     67                 memcpy(next.value , s, sizeof(subType));
     68                 next.value[newz] = s[z];
     69                 next.value[z] = s[newz];
     70                 next.step.assign(cur.step);
     71                 next.step += dirFlag[d];
     72                 if(try_to_insert(next))
     73                 {
     74                     puzzle.push(next);
     75                     if(store_cnt == INF) 
     76                     {
     77                         flag = 1;
     78                         break;
     79                     }
     80                 }
     81             }
     82         }
     83         if(flag) break;
     84     }
     85 }
     86 
     87 int main()
     88 {
     89     #ifndef ONLINE_JUDGE
     90     freopen("input.txt", "r", stdin);
     91 
     92     #endif
     93     
     94     int T;
     95     cin>>T;
     96     
     97     for(int t=1; t<=T; ++t)
     98     {
     99         type input;
    100         for(int i=0; i<SIZE; ++i)
    101         {
    102             cin>>input.value[i];
    103         }
    104         input.step = "\0";
    105         while(!puzzle.empty()) puzzle.pop();
    106         puzzle.push(input);
    107         Traverse();
    108         cout<<"Puzzle #"<<t;
    109         for(int i=0, into=100000000; i<SIZE; ++i, into /= 10)
    110         {
    111             int temp = store_num/into;
    112             if(i%3 == 0) cout<<endl;
    113             else cout<<" ";
    114             cout<<temp;
    115             store_num %= into;
    116         }
    117         cout<<"\n"<<store_string<<endl;
    118         cout<<endl;
    119     }
    120     return 0;
    121 }

     

     

  • 相关阅读:
    windows 服务实现定时任务调度(Quartz.Net)
    C#编写windows服务,多服务为什么只启动一个(ServiceBase.Run)
    微服务之springCloud-docker-feign(四)
    微服务之springCloud-docker-comsumer(三)
    微服务之springCloud和docker-provide(二)
    docker探索-使用docker service管理swarm(十一 )
    微服务之springCloud和docker-Eureka(一)
    docker打开api remote接口设置
    docker探索-CentOS7中配置Docker的yum源并升级安装docker1.13(十)
    docker探索-docker私有仓库搭建(九)
  • 原文地址:https://www.cnblogs.com/liaoguifa/p/3072334.html
Copyright © 2020-2023  润新知