zoukankan      html  css  js  c++  java
  • 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 ;

             }

    }


  • 相关阅读:
    oraToolKit Oracle安装辅助工具的使用方法
    oraToolKit Oracle安装辅助工具的使用方法
    创建Oracle数据库、数据库名与实例名与SID之间的关系(图文详解)
    创建Oracle数据库、数据库名与实例名与SID之间的关系(图文详解)
    RHEL6.1 安装 Oracle10gr2 (图文、解析)
    RHEL6.1 安装 Oracle10gr2 (图文、解析)
    14.1.3 Turning Off InnoDB 关掉InnoDB
    zabbix 获取jvm session信息
    Mysql 执行计划分析
    mysql 执行计划走索引
  • 原文地址:https://www.cnblogs.com/wlxtuacm/p/5712286.html
Copyright © 2011-2022 走看看