bfs题目集锦


ZOJ1438 :  http://acm.zju.edu.cn/show_problem.php?pid=1438

一道最基础的BFS题,就是求在三维迷宫中从一个点到另外一个点的最短距离.

就是在输入的时候它不像以前那样先行再列最后层数,要小心

/*

*  简单的BFS

*  由于输入问题一开始WA了n次

*/

#include <iostream>

#include <deque>

#include <string>

 

using namespace std ;

 

struct Node

{

         int x, y, z ;

}temp, t, aim ;

 

deque<Node> de[2] ;

 

bool mark[12][12][12] ;

char maze[12][12][12] ;

int Size, step ;

int walk[6][3] ;

 

bool operator ==(Node &a, Node &b)

{

         if ( a.x == b.x && a.y == b.y && a.z == b.z ) return true ;

         return false ;

}

void initi()

{

         int i, j, k ;

         for ( k = 0 ; k < Size ; k++ ) {

                   for ( j = 0 ; j < Size ; j++ ) {

                            getchar() ;

                            for ( i = 0 ; i < Size ; i++ ) {

                                     scanf ( "%c", &maze[i][j][k] ) ;

                                     mark[i][j][k] = false ;

                            }

                   }

         }

         scanf ( "%d%d%d", &temp.x, &temp.y, &temp.z ) ;

         scanf ( "%d%d%d", &aim.x, &aim.y, &aim.z ) ;

         mark[temp.x][temp.y][temp.z] = true ;

         de[0].clear() ; de[1].clear() ;

         de[0].push_back(temp) ;

         step = 0 ;

}

 

void work()

{

         int now = 0, n, i ;

         while ( !de[0].empty() || !de[1].empty() ) {

                   n = now^1 ;

                   while ( !de[now].empty() ) {

                            temp = de[now].front() ;

                            de[now].pop_front() ;

                            if ( temp == aim ) {

                                     printf ( "%d %d/n", Size, step ) ;

                                     return ;

                            }

                            for ( i = 0 ; i < 6 ; i++ ) {

                                     t.x = temp.x+walk[i][0] ;

                                     t.y = temp.y+walk[i][1] ;

                                     t.z = temp.z+walk[i][2] ;

                                     if ( t.x < 0 || t.y < 0 || t.z < 0

                                               || t.x >= Size || t.y >= Size || t.z >= Size ) continue ;

                                     if ( maze[t.x][t.y][t.z] == 'O' && !mark[t.x][t.y][t.z] ) {

                                               mark[t.x][t.y][t.z] = true ;

                                               de[n].push_back(t) ;

                                     }

                            }

                   }

                   now = n ;

                   step ++ ;

         }

         printf ( "NO ROUTE/n" ) ;

}

void init()

{

         walk[0][0] = 1 ; walk[0][1] = 0 ; walk[0][2] = 0 ;

         walk[1][0] = 0 ; walk[1][1] = 1 ; walk[1][2] = 0 ;

         walk[2][0] = 0 ; walk[2][1] = 0 ; walk[2][2] = 1 ;

         walk[3][0] = -1 ; walk[3][1] = 0 ; walk[3][2] = 0 ;

         walk[4][0] = 0 ; walk[4][1] = -1 ; walk[4][2] = 0 ;

         walk[5][0] = 0 ; walk[5][1] = 0 ; walk[5][2] = -1 ;

}

 

int main ( void )

{

         string str ;

         init() ;

         while ( cin >> str >> Size ) {

                   initi() ;

                   cin >> str ;

                   work() ;

         }

         return 0 ;

}

 

ZOJ2050 : http://acm.zju.edu.cn/show_problem.php?pid=2050

题目意思就是从输入状态一直换,知道矩阵中全是b状态或者全是w状态,换的方法是随便从矩阵中选一个值出来,和它相临的全部取反(包括它自己这个点也取反).

就是BFS从一个状态换到另外一个状态的最少步数,关键在于如何存状态,由于位数是确定的,所以想到用16位的位运算.

/*

*  0.07s  BFS

*/

#include <iostream>

#include <deque>

 

using namespace std ;

 

deque<int> de[2] ;

int value[18], walk[5][2] ;

bool mark[65536] ;

int step ;

 

void initi()

{

         int i, j ;

         int num = 0 ;

         char ch ;

         for ( i = 0 ; i < 4 ; i++ ) {

                   while ( ch = getchar() ) {

                            if ( ch == 'b' || ch =='w' ) break ;

                   }

                   num = num << 1 ;

                   if ( ch == 'b' ) num ++ ;

                   for ( j = 0 ; j < 3 ; j++ ) {

                            ch = getchar() ;

                            num = num << 1 ;

                            if ( ch == 'b' ) num ++ ;

                   }

         }

         de[0].clear() ; de[1].clear() ;

         de[0].push_back(num) ;

         step = 0 ;

         memset(mark,false,sizeof(mark)) ;

         mark[num] = true ;

}

 

void work()

{

         int now = 0, n, i, j, k ;

         int temp ;

         while ( !de[0].empty() || !de[1].empty() ) {

                   n = now^1 ;

                   while ( !de[now].empty() ) {

                            temp = de[now].front() ;

                            de[now].pop_front() ;

                            if ( temp == 0 || temp == 65535 ) { cout << step << endl ; return ; }

                            int x, y ;

                            for ( i = 0 ; i < 4 ; i++ ) {

                                     for ( j = 0 ; j < 4 ; j++ ) {

                                               x = temp ;

                                               for( k = 0 ; k < 5 ; k++ ) {

                                                        int a = i+walk[k][0] ;

                                                        int b = j+walk[k][1] ;

                                                        if ( a < 0 || b < 0 || a >= 4 || b >= 4 ) continue ;

                                                        y = 16-(a*4+b) ;

                                                        if ( 1&(x>>y-1) ) {

                                                                 x = ~x ;

                                                                 x = x|value[y] ;

                                                                 x = ~x ;

                                                        }

                                                        else x = x|value[y] ;

                                               }

                                               if ( !mark[x] ) { de[n].push_back(x) ; mark[x] = true ; }

                                     }

                            }

                   }

                   now = n ;

                   step ++ ;

         }

         cout << "Impossible" << endl ;

}

 

void init()

{

         walk[4][0] = 0 ; walk[4][1] = 0 ;

         walk[0][0] = 1 ; walk[0][1] = 0 ;

         walk[1][0] = 0 ; walk[1][1] = 1 ;

         walk[2][0] = -1 ; walk[2][1] = 0 ;

         walk[3][0] = 0 ; walk[3][1] = -1 ;

         int num = 1, i ;

         value[1] = 1 ;

         for ( i = 2 ; i <= 16 ; i++ ) {

                   num = num << 1 ;

                   value[i] = num ;

         }

}

int main ( void )

{

         int T ;

         init() ;

         scanf ( "%d", &T ) ;

         while ( T -- ) {

                   initi() ;

                   work() ;

                   if ( T ) cout << endl ;

         }

         return 0 ;

}

ZOJ2081 :  http://acm.zju.edu.cn/show_problem.php?pid=2081

题目意思大概就是在一个二维迷宫中从一个点到另外一个点存在很多最短路,但是迷宫中有炸弹存在,问最短路中有多少条是没有经过炸弹的,输出它的百分比.

就用BFS求最短路并标记有炸弹的路

/*

* 0.00s  BFS

*/

#include <iostream>

#include <deque>

 

using namespace std ;

 

#define MAXN 10000000

struct Node

{

         int x, y ;

         bool ok ;

}temp, t ;

 

deque<Node> de[2] ;

int step, row, column, e_x, e_y ;

char maze[12][12] ;

int mark[12][12] ;

int walk[4][2] ;

 

void work()

{

         int now = 0, n, i ;

         int die = 0, live = 0 ;

         step = 1 ;

         while ( !de[0].empty() || !de[1].empty() ) {

                   n = now^1 ;

                   bool loop = false ;

                   while ( !de[now].empty() ) {

                            temp = de[now].front() ;

                            de[now].pop_front() ;

                            for ( i = 0 ; i < 4 ; i++ ) {

                                     t.x = temp.x+walk[i][0] ;

                                     t.y = temp.y+walk[i][1] ;

                                     if ( t.x < 0 || t.y < 0 || t.x >= row || t.y >= column ) continue ;

                                     if ( step > mark[t.x][t.y] ) continue ;

                                     if ( maze[t.x][t.y] == 'M' ) {

                                               t.ok = true ;

                                               de[n].push_back(t) ;

                                     }

                                     else if ( maze[t.x][t.y] == 'T' ) {

                                               if ( temp.ok ) die ++ ;

                                               else live ++ ;

                                               loop = true ;

                                               break ;

                                     }

                                     else if ( maze[t.x][t.y] == ' ' ) {

                                               t.ok = temp.ok ;

                                               de[n].push_back(t) ;

                                     }

                                     mark[t.x][t.y] = step ;

                            }

                   }

                   if ( loop ) {

                            if ( live > 0 )

                                     printf ( "The probability for the spy to get to the telegraph transmitter is %.2lf/%%./n", double(live)/(double(live)+double(die))*100.0 ) ;

                            else printf ( "Mission Impossible./n" ) ;

                            return ;

                   }

                   now = n ;

                   step ++ ;

         }

         printf ( "Mission Impossible./n" ) ;

}

 

void initi()

{

         walk[0][0] = -1 ; walk[0][1] = 0 ;

         walk[1][0] = 0 ; walk[1][1] = -1 ;

         walk[2][0] = 1 ; walk[2][1] = 0 ;

         walk[3][0] = 0 ; walk[3][1] = 1 ;

}

 

int main ( void )

{

         int T, i, j, k ;

         initi() ;

         scanf ( "%d", &T ) ;

         for ( k = 1 ; k <= T ; k++  ) {

                   de[0].clear() ; de[1].clear() ;

                   scanf ( "%d%d", &row, &column ) ;

                   for ( i = 0 ; i < row ; i++ ) {

                            getchar() ;

                            for ( j = 0 ; j < column ; j++ ) {

                                     scanf ( "%c", &maze[i][j] ) ;

                                     mark[i][j] = MAXN ;

                                     if ( maze[i][j] == 'S' ) {

                                               temp.x = i ; temp.y = j ;

                                               temp.ok = false ;

                                               mark[i][j] = 0 ;

                                               de[0].push_back(temp) ;

                                     }

                                     else if ( maze[i][j] == 'T' ) {

                                               e_x = i ; e_y = j ;

                                     }

                            }

                   }

                   printf ( "Mission #%d:/n", k ) ;

                   work() ;

                   printf ( "/n" ) ;

         }

         return 0 ;

}

以下都是一些BFS的题目:

ZOJ1310 :  http://acm.zju.edu.cn/show_problem.php?pid=1310

/*

* 0.05 BFS

*/

#include <iostream>

#include <deque>

#include <string>

 

using namespace std ;

 

#define North 0

#define East 1

#define South 2

#define West 3

 

struct Node

{

         int x, y ;

         int towards ;

}temp, t ;

int step, B1, B2, E1, E2, S ;

int walk[4][2], store[52][52], row, column ;

bool mark[52][52][4] ;

deque<Node> de[2] ;

 

void initi1()

{

         walk[North][0] = -1 ; walk[North][1] = 0 ;

         walk[East][0] = 0 ; walk[East][1] = 1 ;

         walk[South][0] = 1 ; walk[South][1] = 0 ;

         walk[West][0] = 0 ; walk[West][1] = -1 ;

}

 

void initi2()

{

         int i, j, k ;

         for ( i = 0 ; i < row ; i++ ) {

                   for ( j = 0 ; j < column ; j++ ) {

                            scanf ( "%d", &store[i][j] ) ;

                   }

         }

         scanf ( "%d%d%d%d", &B1, &B2, &E1, &E2 ) ;

         string str ;

         cin >> str ;

         if ( str == "south" ) S = South ;

         else if ( str == "east" ) S = East ;

         else if ( str == "west" ) S = West ;

         else if ( str == "north") S = North ;

         de[0].clear() ; de[1].clear() ;

         step = 0 ;

         for ( i = 0 ; i < row ; i++ ) {

                   for ( j = 0 ; j < column ; j++ ) {

                            for ( k = 0 ; k < 4 ; k++ ) {

                                     mark[i][j][k] = false ;

                            }

                   }

         }

         temp.x = B1-1 ; temp.y = B2-1 ;

         E1 -- ; E2 -- ;

         temp.towards = S ;

         mark[temp.x][temp.y][temp.towards] = true ;

         de[0].push_back(temp) ;

}

 

bool judge()

{

         if ( temp.towards == North ) {

                   if ( temp.y+1 >= column ) return false ;

                   if ( store[temp.x-1][temp.y] == 1 ) return false ;

                   if ( store[temp.x-1][temp.y+1] == 1 ) return false ;

         }

         if ( temp.towards == South ) {

                   if ( temp.x+2 >= row || temp.y+1 >= column ) return false ;

                   if ( store[temp.x+2][temp.y] == 1 ) return false ;

                   if ( store[temp.x+2][temp.y+1] == 1 ) return false ;

         }

         if ( temp.towards == East ) {

                   if ( temp.y+2 >= column || temp.x+1 >= row ) return false ;

                   if ( store[temp.x][temp.y+2] == 1 ) return false ;

                   if ( store[temp.x+1][temp.y+2] == 1 ) return false ;

         }

         if ( temp.towards == West ) {

                   if ( temp.x+1 >= row ) return false ;

                   if ( store[temp.x][temp.y-1] == 1 ) return false ;

                   if ( store[temp.x+1][temp.y-1] == 1 ) return false ;

         }

         return true ;

}

 

int BFS()

{

         int now = 0 ;

         while ( !de[0].empty() || !de[1].empty() ) {

                   int n = now^1 ;

                   while ( !de[now].empty() ) {    

                            temp = de[now].front() ;

                            de[now].pop_front() ;

                            if ( temp.x == E1 && temp.y == E2 ) return step ;

                            t = temp ;

                            t.towards = (temp.towards+1)%4 ;

                            if ( !mark[t.x][t.y][t.towards] ) {

                                     mark[t.x][t.y][t.towards] = true ;

                                     de[n].push_back(t) ;

                            }

                            t.towards = temp.towards-1 ;

                            if ( t.towards == -1 ) t.towards = 3 ;

                            if ( !mark[t.x][t.y][t.towards] ) {

                                     mark[t.x][t.y][t.towards] = true ;

                                     de[n].push_back(t) ;

                            }

                            t = temp ;

                            for ( int i = 0 ; i < 3 ; i++ ) {

                                     temp = t ;

                                     t.x += walk[t.towards][0] ;

                                     t.y += walk[t.towards][1] ;

                                     if ( t.x < 0 || t.x >= row || t.y < 0 || t.y >= column ) break ;

                                     if ( !judge() ) break ;

                                     if ( !mark[t.x][t.y][t.towards] ) {

                                               mark[t.x][t.y][t.towards] = true ;

                                               de[n].push_back(t) ;

                                     }

                            }

                   }

                   step ++ ;

                   now = n ;

         }

         return -1 ;

}

 

int main ( void )

{

         initi1() ;

         while ( 2 == scanf ( "%d%d", &row, &column ) ) {

                   if ( row == 0 && column == 0 ) break ;

                   initi2() ;

                   int ans = BFS() ;

                   printf ( "%d/n", ans ) ;

         }

         return 0 ;

}

ZOJ1671 : http://acm.zju.edu.cn/show_problem.php?pid=1671

/*

         ZOJ1671  2006-10-3  21:45

         Times : 0ms    menory : 840

         ant 从出发点开始,上下左右的走。每走一步消耗一个体力值。

 

它出发时的体力值为6.走到食物所在的格就可以将体力又回到

 

6。问最少走多少步到洞口,也就是它的目的地.如果不能就输出

 

-1.注意当它在某个格子体力值为1,那么当它移动时体力就要下

 

降,那么哪怕下个要走到的格子就有食物或者就是目的地时,

 

它也不能走到那个格子。

 

输入:

 

先给出矩阵的大小N,M,它们在8以内.

 

下面N行M列代表矩阵的情形,其中2代表出发点。3代表目的地,4代表食物.

 

1代表可走到的格子,0代表不可走到的格子.

 

整个测试以二个0代表结束

 

BFS :

增加一个2维数组记录走到当前位子的life值,若life值比当前位子大则可以走

*/

#include <iostream>

#include <deque>

 

using namespace std ;

 

struct pp

{

         int x, y, step ;

}temp, t ;

 

int MAP[12][12], mark[12][12] ;

int row, column ;

bool p ;

deque<pp> de ;

 

void BFS() ;

bool judge(int x, int y, int step, int life) ;

 

int main ( void )

{

         int i, j ;

         for ( i = 0 ; i < 10 ; i++ ) {

                   MAP[0][i] = 0 ;

                   MAP[i][0] = 0 ;

         }

         while ( 2 == scanf ( "%d%d", &column, &row ) ) {

                   if ( row == 0 && column == 0 ) break ;

                   de.clear() ;

                   for ( i = 1 ; i <= row ; i++ ) {

                            for ( j = 1 ; j <= column ; j++ ) {

                                     scanf ( "%d", &MAP[i][j] ) ;

                                     mark[i][j] = 0 ;

                                     if ( MAP[i][j] == 2 ) {

                                               temp.x = i ;

                                               temp.y = j ;

                                               temp.step = 0 ;

                                               de.push_back(temp) ;

                                               mark[i][j] = 6 ;

                                               MAP[i][j] = 0 ;

                                     }

                            }

                   }

                  

                   for ( i = 1 ; i <= row+1 ; i++ )

                            MAP[i][column+1] = 0 ;

                   for ( i = 1 ; i <= column+1 ; i++ )

                            MAP[row+1][i] = 0 ;

                   p = 0 ;

                   BFS() ;

                   if ( !p ) printf ( "-1/n" ) ;

         }

         return 0 ;

}

 

void BFS()

{

         while ( !de.empty() ) {

                   temp = de.front() ;

                   de.pop_front() ;

                   int life = mark[temp.x][temp.y]-1 ;

                   if ( life > mark[temp.x][temp.y+1]) {

                   if (judge(temp.x, temp.y+1, temp.step+1, life)) return ;

                   }

                   if ( life > mark[temp.x][temp.y-1]) {

                   if (judge(temp.x, temp.y-1, temp.step+1, life)) return ;

                   }

                   if ( life > mark[temp.x+1][temp.y]) {

                   if (judge(temp.x+1, temp.y, temp.step+1, life)) return ;

                   }

                   if ( life > mark[temp.x-1][temp.y]) {

                   if (judge(temp.x-1, temp.y, temp.step+1, life)) return ;

                   }

         }

}

 

bool judge(int x, int y, int step, int life)

{

         if ( MAP[x][y] == 3 ) {

                   p = 1 ;

                   printf ( "%d/n", step ) ;

                   return 1 ;

         }

         if ( MAP[x][y] != 0 ) {

                   t.x = x ;

                   t.y = y ;

                   t.step = step ;

                   de.push_back(t) ;

                   if ( MAP[x][y] == 1 ) {

                            mark[x][y] = life ;

                   }

                   else mark[x][y] = 6 ;

         }

         return 0 ;

}

ZOJ1217 :  http://acm.zju.edu.cn/show_problem.php?pid=1217

/*

* 1.10s  BFS

*/

#include <iostream>

#include <deque>

#include <string>

#include <set>

#include <map>

#include <algorithm>

 

using namespace std ;

 

#define aim 87654321

struct Node

{

         int num ;

         int pos ;

         string step ;

}temp, t ;

deque<Node> de ;

int move[4][4] ;

set<int> mark ;

map<int,string> ans ;

 

bool initi()

{

         int i, j, position ;

         char x ;

         for ( i = 0 ; i < 3 ; i ++ ) {

                   for ( j = 0 ; j < 3 ; j++ ) {

                            while ( 1 ) {

                                     if ( EOF == scanf ( "%c", &x ) ) return false ;

                                     if ( x == 'x' )  { move[i][j] = 0 ; break ; }

                                     if ( x < '0' || x > '9' ) continue ;

                                     move[i][j] = x-'0' ;

                                     break ;

                            }

                   }

         }

         temp.num = 0 ;

         for ( i = 2 ; i >= 0 ; i-- ) {

                   for ( j = 2 ; j >= 0 ; j-- ) {

                            temp.num = temp.num*10+move[i][j] ;

                   }

         }

         return true ;

}

 

int change()

{

         int i, j, k = 0 ;

         for ( i = 2 ; i >= 0 ; i-- ) {

                   for ( j = 2 ; j >= 0 ; j-- ) {

                            k = k*10 + move[i][j] ;

                   }

         }

         return k ;

}

        

void work()

{

         int i, j ;

         temp.num = 87654321 ; temp.pos = 8 ; temp.step = "" ;

         de.push_back(temp) ;

         mark.clear() ;

         mark.insert(87654321) ;

         while ( !de.empty() ) {

                   temp = de.front() ;

                   de.pop_front() ;

                   int x = temp.pos/3 ;

                   int y = temp.pos%3 ;

                   for ( i = 0 ; i < 3 ; i++ ) {

                            for ( j = 0 ; j < 3 ; j++ ) {

                                     if ( x == i && y == j ) { temp.num /= 10 ; continue ; }

                                     move[i][j] = temp.num%10 ;

                                     temp.num /= 10 ;

                            }

                   }

                   int a = x, b = y, dig ;

                   a ++ ;

                   if ( a < 3 ) {

                            move[x][y] = move[a][b] ;

                            move[a][b] = 0 ;

                            dig = change() ;

                            if ( mark.find(dig) == mark.end() ) {

                                     t.num = dig ;

                                     t.pos = a*3+b ;

                                     mark.insert(dig) ;

                                     t.step = temp.step+'u' ;

                                     ans[dig] = t.step ;

                                     de.push_back(t) ;

                            }

                            move[a][b] = move[x][y] ;

                   }

                   a -= 2 ;

                   if ( a >= 0 ) {

                            move[x][y] = move[a][b] ;

                            move[a][b] = 0 ;

                            dig = change() ;

                            if ( mark.find(dig) == mark.end() ) {

                                     t.num = dig ;

                                     t.pos = a*3+b ;

                                     mark.insert(dig) ;

                                     t.step = temp.step+'d' ;

                                     ans[dig] = t.step ;

                                     de.push_back(t) ;

                            }

                            move[a][b] = move[x][y] ;

                   }

                   a ++ ; b ++ ;

                   if ( b < 3 ) {

                            move[x][y] = move[a][b] ;

                            move[a][b] = 0 ;

                            dig = change() ;

                            if ( mark.find(dig) == mark.end() ) {

                                     t.num = dig ;

                                     t.pos = a*3+b ;

                                     mark.insert(dig) ;

                                     t.step = temp.step+'l' ;

                                     ans[dig] = t.step ;

                                     de.push_back(t) ;

                            }

                            move[a][b] = move[x][y] ;

                   }

                   b -= 2 ;

                   if (  b >= 0 ) {

                            move[x][y] = move[a][b] ;

                            move[a][b] = 0 ;

                            dig = change() ;

                            if ( mark.find(dig) == mark.end() ) {

                                     t.num = dig ;

                                     t.pos = a*3+b ;

                                     mark.insert(dig) ;

                                     t.step = temp.step+'r' ;

                                     ans[dig] = t.step ;

                                     de.push_back(t) ;

                            }

                            move[a][b] = move[x][y] ;

                   }

         }

}

int main ( void )

{

         work() ;

         while ( initi() ) {

                   if ( ans.find(temp.num) == ans.end() ) {

                            cout << "unsolvable" << endl ;

                            continue ;

                   }

                   reverse(ans[temp.num].begin(),ans[temp.num].end()) ;

                   cout << ans[temp.num] << endl ;

         }

         return 0 ;

}

ZOJ1505 :  http://acm.zju.edu.cn/show_problem.php?pid=1505

/*

*       8.91s  7260K

*       单向BFS

*/

#include <iostream>

#include <set>

#include <deque>

 

using namespace std ;

 

struct Node

{

         long long num ;

         int step ;

}te, ben ;

 

deque<Node> de ;

set<long long> s ;

long long aim ;

 

struct Point

{

         int x, y ;

}p[4] ;

 

bool BFS() ;

long long p_l() ;

void l_p(long long) ;

void Search() ;

int main ( void )

{

         while ( EOF != scanf( "%d%d%d%d%d%d%d%d", &p[0].x, &p[0].y, &p[1].x, &p[1].y,

                   &p[2].x, &p[2].y, &p[3].x, &p[3].y ) ) {

                            Node temp ;

                            temp.num = p_l() ;

                            temp.step = 0 ;

                            s.clear() ; de.clear() ;

                            s.insert(temp.num) ;

                            de.push_back(temp) ;

                            scanf( "%d%d%d%d%d%d%d%d", &p[0].x, &p[0].y, &p[1].x, &p[1].y,

                            &p[2].x, &p[2].y, &p[3].x, &p[3].y ) ;

                            aim = p_l() ;

                            if ( BFS() ) printf ( "YES/n" ) ;

                            else printf ( "NO/n" ) ;

                   }

         return 0 ;

}

 

bool BFS()

{

         while ( !de.empty() ) {

                   te = de.front() ;

                   de.pop_front() ;

                   if ( te.num == aim ) return true ;

                   if ( te.step == 9 ) break ;

                   l_p(te.num) ;

                   Search() ;

         }

         return false ;

}

 

long long p_l()

{

         int a, b, c, d ;

         a = (p[0].x-1)*8+p[0].y ;

         b = (p[1].x-1)*8+p[1].y ;

         c = (p[2].x-1)*8+p[2].y ;

         d = (p[3].x-1)*8+p[3].y ;

         long long num = 0, x, i ;

         x = 1 ;

         x = x << (a-1) ;

         num = num|x ;

         x = 1 ;

         x = x << (b-1) ;

         num = num|x ;

         x = 1 ;

         x = x << (c-1) ;

         num = num|x ;

         x = 1 ;

         x = x << (d-1) ;

         num = num|x ;

         return num ;

}

 

void l_p(long long x)

{

         int bit, n = 0, k ;

         for ( bit = 1 ; bit <= 64 ; bit++ ) {

                   if ( n == 4 ) break ;

                   if ( x&1 ) {

                            k = bit ;

                            p[n].y = k%8 ;

                            k /= 8 ;

                            p[n].x = k ;

                            if ( p[n].y == 0 ) p[n].y = 8 ;

                            else p[n].x ++ ;

                            n ++ ;

                   }

                   x = x >> 1 ;

         }

}

 

void Search()

{

         Point t ;

         int i, j ;

         long long num ;

         for ( i = 0 ; i < 4 ; i++ ) {

                   t = p[i] ;

                   p[i].x -- ;

                   if ( p[i].x > 0 ) {

                            for ( j = 0 ; j < 4 ; j++ ) {

                                     if ( j == i ) continue ;

                                     if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                            }

                            if ( j == 4 ) {

                                     num = p_l() ;

                                     if ( s.find(num) == s.end() ) {

                                               ben.num = num ;

                                               ben.step = te.step +1 ;

                                               de.push_back(ben) ;

                                               s.insert(num) ;

                                     }

                            }

                            else {

                                     p[i].x -- ;

                                     if ( p[i].x > 0 ) {

                                               for ( j = 0 ; j < 4 ; j++ ) {

                                                        if ( j == i ) continue ;

                                                        if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                                               }

                                               if ( j == 4 ) {

                                                        num = p_l() ;

                                                        if ( s.find(num) == s.end() ) {

                                                                 ben.num = num ;

                                                                 ben.step = te.step +1 ;

                                                                 de.push_back(ben) ;

                                                                 s.insert(num) ;

                                                        }

                                               }

                                     }

                            }

                   }

                   p[i] = t ;

                   p[i].y -- ;

                   if ( p[i].y > 0 ) {

                            for ( j = 0 ; j < 4 ; j++ ) {

                                     if ( j == i ) continue ;

                                     if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                            }

                            if ( j == 4 ) {

                                     num = p_l() ;

                                     if ( s.find(num) == s.end() ) {

                                               ben.num = num ;

                                               ben.step = te.step +1 ;

                                               de.push_back(ben) ;

                                               s.insert(num) ;

                                     }

                            }

                            else {

                                     p[i].y -- ;

                                     if ( p[i].y > 0 ) {

                                               for ( j = 0 ; j < 4 ; j++ ) {

                                                        if ( j == i ) continue ;

                                                        if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                                              }

                                               if ( j == 4 ) {

                                                        num = p_l() ;

                                                        if ( s.find(num) == s.end() ) {

                                                                 ben.num = num ;

                                                                 ben.step = te.step +1 ;

                                                                 de.push_back(ben) ;

                                                                 s.insert(num) ;

                                                        }

                                               }

                                     }

                            }

                   }

                   p[i] = t ;

                   p[i].x ++ ;

                   if ( p[i].x < 9 ) {

                            for ( j = 0 ; j < 4 ; j++ ) {

                                     if ( j == i ) continue ;

                                     if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                            }

                            if ( j == 4 ) {

                                     num = p_l() ;

                                     if ( s.find(num) == s.end() ) {

                                               ben.num = num ;

                                               ben.step = te.step +1 ;

                                               de.push_back(ben) ;

                                               s.insert(num) ;

                                     }

                            }

                            else {

                                     p[i].x ++ ;

                                     if ( p[i].x < 9 ) {

                                               for ( j = 0 ; j < 4 ; j++ ) {

                                                        if ( j == i ) continue ;

                                                        if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                                               }

                                               if ( j == 4 ) {

                                                        num = p_l() ;

                                                        if ( s.find(num) == s.end() ) {

                                                                 ben.num = num ;

                                                                 ben.step = te.step +1 ;

                                                                 de.push_back(ben) ;

                                                                 s.insert(num) ;

                                                        }

                                               }

                                     }

                            }

                   }

                   p[i] = t ;

                   p[i].y ++ ;

                   if ( p[i].y < 9 ) {

                            for ( j = 0 ; j < 4 ; j++ ) {

                                     if ( j == i ) continue ;

                                     if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                            }

                            if ( j == 4 ) {

                                     num = p_l() ;

                                     if ( s.find(num) == s.end() ) {

                                               ben.num = num ;

                                               ben.step = te.step +1 ;

                                               de.push_back(ben) ;

                                               s.insert(num) ;

                                     }

                            }

                            else {

                                     p[i].y ++ ;

                                     if ( p[i].y < 9 ) {

                                               for ( j = 0 ; j < 4 ; j++ ) {

                                                        if ( j == i ) continue ;

                                                        if ( p[i].x == p[j].x && p[i].y == p[j].y ) break ;

                                               }

                                               if ( j == 4 ) {

                                                        num = p_l() ;

                                                        if ( s.find(num) == s.end() ) {

                                                                 ben.num = num ;

                                                                 ben.step = te.step +1 ;

                                                                 de.push_back(ben) ;

                                                                 s.insert(num) ;

                                                        }

                                               }

                                     }

                            }

                   }

                   p[i] = t ;

         }

}


posted @ 2016-04-21 23:51  adfae  阅读(383)  评论(0编辑  收藏  举报