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 

  9 struct point

 10 {

 11     int x,y;

 12 };

 13 struct node

 14 {

 15     point chess[4];

 16     

 17     bool check(int j)

 18     {

 19         if(chess[j].x>=0 && chess[j].x<=7 && chess[j].y>=0 && chess[j].y<=7)

 20         {

 21             for(int i=0;i<4;i++)

 22             {

 23                 if(i!=j && chess[i].x==chess[j].x && chess[i].y==chess[j].y)

 24                 {

 25                     return false;

 26                 }

 27             }

 28             return true;

 29         }

 30         return false;

 31     }

 32 }s,e;

 33 

 34 bool cmp(const struct point& a,const struct point& b)

 35 {

 36     if(a.x == b.x)

 37     {

 38         return a.y<b.y;

 39     }

 40     return a.x<b.x;

 41 }

 42 int gethash(node& a)

 43 {

 44     sort(a.chess, a.chess+4, cmp);

 45     int hash = 0;

 46     for(int i=0; i<4; i++)

 47     {

 48         hash |= a.chess[i].x << (6*i);

 49         hash |= a.chess[i].y << (6*i+3);

 50     }

 51     return hash;

 52 }

 53 

 54 map<int,int>mapint;

 55 map<int,int>::iterator it_1,it_2;

 56 

 57 bool BFS(void)

 58 {

 59     queue<node>que[2];

 60     

 61     que[0].push(s);

 62     que[1].push(e);

 63     mapint[gethash(s)] = 10*0+0;

 64     mapint[gethash(e)] = 10*1+0;

 65     

 66     int sign;

 67     while(!que[0].empty() || !que[1].empty())

 68     {

 69         if(que[0].size() < que[1].size())

 70         {

 71             sign = que[0].empty() ? 1:0;

 72         }

 73         else

 74         {

 75             sign = que[1].empty() ? 0:1;

 76         }

 77         

 78         node temp = que[sign].front();

 79         que[sign].pop();

 80         

 81         it_1 = mapint.find(gethash(temp));

 82         

 83         if((it_1->second)%10 >= 4)    //移动步数超过4步 

 84         {

 85             continue;

 86         }

 87         for(int i=0;i<4;i++)

 88         {

 89             for(int j=0;j<4;j++)

 90             {

 91                 node next = temp;

 92                 next.chess[i].x += dir[j][0];

 93                 next.chess[i].y += dir[j][1];

 94                 

 95                 if(!next.check(i))        //重叠或者越界 

 96                 {

 97                     next.chess[i].x += dir[j][0];

 98                     next.chess[i].y += dir[j][1];

 99                     if(!next.check(i))    //重叠或者越界 

100                     {

101                         continue;

102                     }

103                 }

104                 

105                 int hash = gethash(next);

106                 it_2 = mapint.find(hash);

107                     

108                 if(it_2 == mapint.end())

109                 {

110                     mapint[hash] = it_1->second + 1;

111                     que[sign].push(next);

112                 }

113                 else if(it_2->second/10 == 1-sign)

114                 {

115                     return true;

116                 }

117             }

118         }

119     }

120     return false;

121 }

122 

123 int main()

124 {

125     while(cin>>s.chess[0].x>>s.chess[0].y)

126     {

127         for(int i=1; i<4; i++)

128         {

129             cin>>s.chess[i].x>>s.chess[i].y;

130         }

131         for(int i=0; i<4; i++)

132         {

133             cin>>e.chess[i].x>>e.chess[i].y;

134         }

135         for(int i=0;i<4;i++)

136         {

137             s.chess[i].x--; s.chess[i].y--;

138             e.chess[i].x--; e.chess[i].y--;

139         }

140         

141         if(BFS())

142         {

143             cout<<"YES"<<endl;

144         }

145         else

146         {

147             cout<<"NO"<<endl;

148         }

149         mapint.clear();

150     }

151     return 0;

152 }

 

你可能感兴趣的:(hash)