• HDU_1401——分步双向BFS,八进制乘权值压缩,map存放hash


    Problem Description
    Solitaire is a game played on a chessboard 8x8. The rows and columns of the chessboard are numbered from 1 to 8, from the top to the bottom and from left to right respectively.
    There are four identical pieces on the board. In one move it is allowed to:
    > move a piece to an empty neighboring field (up, down, left or right),
    > jump over one neighboring piece to an empty field (up, down, left or right).
    There are 4 moves allowed for each piece in the configuration shown above. As an example let's consider a piece placed in the row 4, column 4. It can be moved one row up, two rows down, one column left or two columns right.
    Write a program that:
    > reads two chessboard configurations from the standard input,
    > verifies whether the second one is reachable from the first one in at most 8 moves,
    > writes the result to the standard output.
     
    Input
    Each of two input lines contains 8 integers a1, a2, ..., a8 separated by single spaces and describes one configuration of pieces on the chessboard. Integers a2j-1 and a2j (1 <= j <= 4) describe the position of one piece - the row number and the column number respectively. Process to the end of file.
     
    Output
    The output should contain one word for each test case - YES if a configuration described in the second input line is reachable from the configuration described in the first input line in at most 8 moves, or one word NO otherwise.
     
    Sample Input
    4 4 4 5 5 4 6 5 2 4 3 3 3 6 4 6
     
    Sample Output
    YES
      1 #include <iostream>
      2 #include <algorithm>
      3 #include <queue>
      4 #include <map>
      5 using namespace std;
      6 
      7 const int dir[4][2] = {1,0,-1,0,0,1,0,-1};
      8 const int pow[8] = {1,8,64,512,4096,32768,262144,2097152};
      9 
     10 struct point
     11 {
     12     int x,y;
     13 };
     14 struct node
     15 {
     16     point chess[4];
     17     
     18     bool check(int j)
     19     {
     20         if(chess[j].x>=0 && chess[j].x<=7 && chess[j].y>=0 && chess[j].y<=7)
     21         {
     22             for(int i=0;i<4;i++)
     23             {
     24                 if(i!=j && chess[i].x==chess[j].x && chess[i].y==chess[j].y)
     25                 {
     26                     return false;
     27                 }
     28             }
     29             return true;
     30         }
     31         return false;
     32     }
     33 }s,e;
     34 
     35 bool cmp(const struct point& a,const struct point& b)
     36 {
     37     if(a.x == b.x)
     38     {
     39         return a.y<b.y;
     40     }
     41     return a.x<b.x;
     42 }
     43 int gethash(node& a)
     44 {
     45     sort(a.chess, a.chess+4, cmp);
     46     int hash = 0;
     47     for(int i=0; i<4; i++)
     48     {
     49         hash += a.chess[i].x * pow[2*i];
     50         hash += a.chess[i].y * pow[2*i+1];
     51     }
     52     return hash;
     53 }
     54 
     55 map<int,int>mapint;
     56 map<int,int>::iterator it_1,it_2;
     57 
     58 bool BFS(int flag,node temp)
     59 {
     60     queue<node>que;
     61     que.push(temp);
     62     while(!que.empty())
     63     {
     64         temp = que.front();
     65         que.pop();
     66         
     67         it_1 = mapint.find(gethash(temp));
     68         
     69         if((it_1->second)%10 >= 4)    //移动步数超过4步 
     70         {
     71             continue;
     72         }
     73         for(int i=0;i<4;i++)
     74         {
     75             for(int j=0;j<4;j++)
     76             {
     77                 node next = temp;
     78                 next.chess[i].x += dir[j][0];
     79                 next.chess[i].y += dir[j][1];
     80                 
     81                 if(!next.check(i))    //重叠或者越界 
     82                 {
     83                     next.chess[i].x += dir[j][0];
     84                     next.chess[i].y += dir[j][1];
     85                     if(!next.check(i))        //重叠或者越界 
     86                     {
     87                         continue;
     88                     }
     89                 }
     90                 
     91                 int hash_next = gethash(next);
     92                 it_2 = mapint.find(hash_next);
     93                     
     94                 if(it_2 == mapint.end())
     95                 {
     96                     mapint[hash_next] = it_1->second + 1;
     97                     que.push(next);
     98                 }
     99                 else if(it_2->second/10 == 1-flag)
    100                 {
    101                     return true;
    102                 }
    103             }
    104         }
    105     }
    106     return false;
    107 }
    108 
    109 int main()
    110 {
    111     while(cin>>s.chess[0].x>>s.chess[0].y)
    112     {
    113         for(int i=1;i<4;i++)
    114         {
    115             cin>>s.chess[i].x>>s.chess[i].y;
    116         }
    117         for(int i=0;i<4;i++)
    118         {
    119             cin>>e.chess[i].x>>e.chess[i].y;
    120         }
    121         for(int i=0;i<4;i++)
    122         {
    123             s.chess[i].x--;s.chess[i].y--;
    124             e.chess[i].x--;e.chess[i].y--;
    125         }
    126         mapint[gethash(s)] = 10*0+0;
    127         mapint[gethash(e)] = 10*1+0;
    128         
    129         if(BFS(0,s) || BFS(1,e))
    130         {
    131             cout<<"YES"<<endl;
    132         }
    133         else
    134         {
    135             cout<<"NO"<<endl;
    136         }
    137         
    138         mapint.clear();
    139     }
    140     return 0;
    141 }
    ——现在的努力是为了小时候吹过的牛B!!
  • 相关阅读:
    java常用api
    常用命令
    mysql常用命令
    特性
    centos ubuntu 软件安装
    WebStorm创建Vue项目记录
    登录oracle官网下载资料账号可以使用(保存)(转)
    java学习之路—JDBC—DBUtils
    Linux从入门到精通(第4章--桌面环境)
    Linux从入门到精通(第2章--Linux安装)
  • 原文地址:https://www.cnblogs.com/pingge/p/3195583.html
Copyright © 2020-2023  润新知