HDU1401 BFS

Posted LuZhiyuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1401 BFS相关的知识,希望对你有一定的参考价值。

Solitaire

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4368    Accepted Submission(s): 1324


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
 
Source
题意:
问在8步之内能否从前一个状态到后一个状态,棋子只能上下左右走或者如图中的方式走(跳过相邻的一个棋子)。
代码:
  1 /*
  2 用bool开一个8维数组vis记录状态是否走过,很容易超内存,尽量少开数组减少内存。
  3 */
  4 #include<iostream>
  5 #include<cstring>
  6 #include<queue>
  7 using namespace std;
  8 bool vis[8][8][8][8][8][8][8][8];
  9 bool mp[8][8];
 10 int dir[4][2]={1,0,0,1,-1,0,0,-1};
 11 struct Lu
 12 {
 13     int x[4],y[4],cnt;
 14 }L3;
 15 bool chak(Lu L)
 16 {
 17     for(int i=0;i<4;i++){
 18         if(!mp[L.x[i]][L.y[i]])
 19             return 0;
 20     }
 21     return 1;
 22 }
 23 bool nice(Lu L)
 24 {
 25     for(int i=0;i<4;i++){
 26         if(L.x[i]>7||L.x[i]<0||L.y[i]>7||L.y[i]<0)
 27             return 0;
 28     }
 29     if(vis[L.x[1]][L.y[1]][L.x[2]][L.y[2]][L.x[3]][L.y[3]][L.x[4]][L.y[4]])
 30         return 0;
 31     return 1;
 32 }
 33 bool empt(Lu L,int k)
 34 {
 35     for(int i=0;i<4;i++){
 36         if(i==k) continue;
 37         if(L.x[k]==L.x[i]&&L.y[k]==L.y[i])
 38             return 0;
 39     }
 40     return 1;
 41 }
 42 bool bfs()
 43 {
 44     Lu L2;
 45     queue<Lu>q;
 46     q.push(L3);
 47     while(!q.empty()){
 48         L2=q.front();
 49         q.pop();
 50         if(chak(L2)) return 1;
 51         if(L2.cnt>=8) continue;
 52         for(int i=0;i<4;i++){
 53             for(int j=0;j<4;j++){
 54                 L3=L2;
 55                 L3.x[i]=L2.x[i]+dir[j][0];
 56                 L3.y[i]=L2.y[i]+dir[j][1];
 57                 if(!nice(L3)) continue;
 58                 if(empt(L3,i)){   
 59                     vis[L3.x[1]][L3.y[1]][L3.x[2]][L3.y[2]][L3.x[3]][L3.y[3]][L3.x[4]][L3.y[4]]=true;
 60                     L3.cnt++;
 61                     q.push(L3);
 62                 }
 63                 else{
 64                     L3.x[i]=L3.x[i]+dir[j][0];
 65                     L3.y[i]=L3.y[i]+dir[j][1];
 66                     if(!nice(L3)) continue;
 67                     if(empt(L3,i)){
 68                         vis[L3.x[1]][L3.y[1]][L3.x[2]][L3.y[2]][L3.x[3]][L3.y[3]][L3.x[4]][L3.y[4]]=true;
 69                         L3.cnt++;
 70                         q.push(L3);
 71                     }
 72                 }
 73             }
 74         }
 75     }
 76     return 0;
 77 }
 78 int main()
 79 {
 80     int x,y;
 81     while(cin>>x>>y){
 82         x--;y--;
 83         memset(vis,false,sizeof(vis));
 84         memset(mp,false,sizeof(mp));
 85         L3.x[0]=x;L3.y[0]=y;
 86         for(int i=1;i<4;i++){
 87             cin>>x>>y;
 88             x--;y--;
 89             L3.x[i]=x;L3.y[i]=y;
 90         }
 91         vis[L3.x[1]][L3.y[1]][L3.x[2]][L3.y[2]][L3.x[3]][L3.y[3]][L3.x[4]][L3.y[4]]=true;
 92         for(int i=0;i<4;i++){
 93             cin>>x>>y;
 94             x--;y--;
 95             mp[x][y]=true;
 96         }
 97         L3.cnt=0;
 98         int flag=bfs();
 99         if(flag) cout<<"YES\n";
100         else cout<<"NO\n";
101     }
102     return 0;
103 }

 























以上是关于HDU1401 BFS的主要内容,如果未能解决你的问题,请参考以下文章

双向广搜-HDU1401 Solitaire

HDU3247 Resource Archiver(AC自动机+BFS+DP)

hdu&&poj搜索题题号

HDU 1372 Knight Moves(bfs)

hdu Rescue (bfs)

HDU 1043 Eight(哈希 + BFS)