zoukankan      html  css  js  c++  java
  • [USACO]Magic Squares

    题意:给定你一个2*2的魔方,问你根据它所给的三种变换使得初始的状态,得到目标状况的最少步数。

    解题思路:bfs + 状态压缩,因为8面筛子只有8!,只需要把一个组合数映射到hs数判重即可

    解题代码:

      1 // File Name: msquare.c
      2 // Author: darkdream
      3 // Created Time: 2014年03月10日 星期一 21时01分14秒
      4 /*
      5 ID: dream.y1
      6 PROG: msquare
      7 LANG: C++
      8 */
      9 #include<stdio.h>
     10 #include<string.h>
     11 #include<stdlib.h>
     12 #include<time.h>
     13 #include<math.h>
     14 struct node{
     15   int a[9];
     16   char N;
     17   int step;
     18   int last;
     19 }list[50000];
     20 int hs[50000];
     21 int A[10];
     22 int hehe(int *a)
     23 {
     24     int ths[10] ;
     25     memset(ths,0,sizeof(ths));
     26     int vhs = 0 ;
     27     for(int i = 1;i <= 8 ;i ++)
     28     {
     29         int tsum =0 ; 
     30         for(int j = 1;j < a[i] ;j ++)
     31             if(!ths[j])
     32                 tsum ++ ; 
     33         vhs += (tsum * A[ 8-i ]);
     34         ths[a[i]] = 1; 
     35     }
     36     return vhs;
     37 }
     38 void printans(int p)
     39 {
     40    if(p == 1 )
     41        return;
     42    printans(list[p].last);
     43    printf("%C",list[p].N);
     44 }
     45 int main(){
     46    freopen("msquare.in","r",stdin);
     47    freopen("msquare.out","w",stdout);
     48    memset(hs,0,sizeof(hs));
     49    memset(list,0,sizeof(list));
     50    A[0] = 0; 
     51    A[1] = 1; 
     52    for(int i = 2; i <= 8 ;i ++)
     53    {
     54      A[i] = i* A[i-1];
     55    }
     56    //freopen("/home/plac/problem/input.txt","r",stdin);
     57    int temp[10];
     58 
     59    for(int i = 1;i <= 8 ;i  ++)
     60    {
     61       scanf("%d",&temp[i]) ; 
     62       list[1].a[i] = i ; 
     63    }
     64    int ans = hehe(temp);
     65    //printf("%d
    ",ans);
     66    
     67    if(ans == 0 )
     68    {
     69        printf("0
    
    ");
     70        return 0 ;
     71    }
     72    hs[hehe(list[1].a)] = 1;
     73    list[1].step = 0; 
     74    int low = 1, high = 1; 
     75    while(low <= high )
     76    {
     77       
     78       for(int i = 1;i <= 8;i ++)
     79           temp[i] = list[low].a[9-i];
     80 
     81       int vhs =  hehe(temp);
     82       if(!hs[vhs])
     83       {
     84          hs[vhs] = 1; 
     85          high ++ ; 
     86          list[high].step = list[low].step + 1;  
     87          for(int i = 1;i <= 8;i ++)
     88          {
     89           list[high].a[i] = temp[i];
     90          }
     91          list[high].N = 'A'; 
     92          list[high].last = low;
     93          if(vhs == ans)
     94          {
     95            printf("%d
    ",list[high].step);
     96            printans(high);
     97            break;
     98          }
     99       }  // first
    100       
    101       temp[1] = list[low].a[4];
    102       temp[8] = list[low].a[5];
    103       for(int i= 2;i <= 4;i ++)
    104       {
    105         temp[i] = list[low].a[i-1];
    106       }
    107       for(int i= 5;i <= 7;i ++)
    108       {
    109         temp[i] = list[low].a[i+1];
    110       }
    111       vhs =  hehe(temp);
    112       if(!hs[vhs])
    113       {
    114          hs[vhs] = 1; 
    115          high ++ ; 
    116          list[high].step = list[low].step + 1;  
    117          for(int i = 1;i <= 8;i ++)
    118          {
    119           list[high].a[i] = temp[i];
    120          }
    121          list[high].N = 'B'; 
    122          list[high].last = low;
    123          if(vhs == ans)
    124          {
    125            printf("%d
    ",list[high].step);
    126            printans(high);
    127            break;
    128          }
    129         
    130       }  // 2 change
    131      
    132 
    133       temp[1] = list[low].a[1];
    134       temp[2] = list[low].a[7];
    135       temp[3] = list[low].a[2];
    136       temp[4] = list[low].a[4];
    137       temp[5] = list[low].a[5];
    138       temp[6] = list[low].a[3];
    139       temp[7] = list[low].a[6];
    140       temp[8] = list[low].a[8];
    141       vhs =  hehe(temp);
    142       if(!hs[vhs])
    143       {
    144          hs[vhs] = 1; 
    145          high ++ ; 
    146          list[high].step = list[low].step + 1;  
    147          for(int i = 1;i <= 8;i ++)
    148          {
    149           list[high].a[i] = temp[i];
    150          }
    151          list[high].N = 'C'; 
    152          list[high].last = low;
    153          if(vhs == ans)
    154          {
    155            printf("%d
    ",list[high].step);
    156            printans(high);
    157            break;
    158          }
    159       }
    160    
    161      low ++ ; 
    162    }
    163  printf("
    ");   
    164 return 0 ;
    165 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    noip2012 同余方程
    bzoj1477 poj1061 青蛙的约会
    Nginx 从入门到放弃(五)
    Nginx 从入门到放弃(四)
    Nginx 从入门到放弃(三)
    Nginx 从入门到放弃(二)
    Nginx 从入门到放弃(一)
    python三大神器之fabric
    Docker 学习(一)
    linux就该这么学 第一天学习笔记
  • 原文地址:https://www.cnblogs.com/zyue/p/3606153.html
Copyright © 2011-2022 走看看