zoukankan      html  css  js  c++  java
  • 蛇跟楼梯(BFS)

    样例输入:

    2    // 测试数据个数

    6 1 3 // 棋盘大小 蛇的个数 梯子个数

    35 25  // 蛇的起始位置(蛇头) 蛇的终止位置(蛇尾)

    3 23 5 16 20 33 梯子起始位置(梯子底部) 梯子终止位置(顶部)

    样例输出:

    3

    #include <cstdio>
    #include <cstring>
    #define NMAX  20
    #define SLMAX 200
    
    struct SnakeAndLadder    //蛇和梯子
    {
        int from, to;    //起止位置
    };
    
    int main( )
    {
        int D;        //测试数据的个数
        int N, S, L; //每个测试数据中的N、S、L:棋盘规模、蛇和梯子数目
        int grid[ NMAX*NMAX+1 ];    //棋盘(序号从1开始计)
        //备份上一次棋盘状态(序号从1开始计)
        int gridbak[ NMAX*NMAX+1 ];
        SnakeAndLadder obstacle[ 2*SLMAX ];    //障碍物,包括梯子和蛇
        int i, j, k, m;    //循环变量
        int step;    //投骰子的数目
        int deal;    //如果落脚处是蛇(惩罚)首部或梯子(奖励)底部,则deal为1
        
        scanf( "%d", &D );
    
        for( i=0; i<D; i++ )    //处理每个测试数据
        {
            scanf( "%d%d%d", &N, &S, &L );
            for( j=0; j<S+L; j++ )
                scanf( "%d%d", &obstacle[j].from, &obstacle[j].to );        
            memset( grid, 0, sizeof(grid) );  grid[1] = 1;    //初始化状态数组
            step = 0;    //初始化骰子数目
            //只要第N^2个方格没有扩展为1,则继续按BFS进行扩展
            while( grid[N*N]==0 )
            {
                memcpy( gridbak, grid, sizeof(grid) );//备份上一步棋盘状态
                //grid[ ]数组用来保存在上一步棋盘状态(graibak[ ])下进行扩展后的状态
                memset( grid, 0, sizeof(grid) );
                //搜索所有的格子,最后一格不用搜索,因为在搜索过程结束前它一定为0
                for( j=1; j<=N*N-1; j++ )
                {
                    if( gridbak[j]==0 )    //若在上一步无法到达此格则跳过
                        continue;
                    //考虑点数1~6,走该点数步数后到达j+k位置
                    for( k=1; k<=6; k++ )
                    {
                        deal = 0;
                        if( j+k>N*N )  break;
                        for( m=0; m<S+L; m++ )
                        {
                            //如果j+k位置是某个蛇(或梯子)的起始位置
                            //则沿着它到达终止位置
                            if( obstacle[m].from==j+k )
                            {
                                grid[ obstacle[m].to ] = 1;  deal = 1;
                                break;    //j+k位置上最多只有
                                        //一个蛇(或梯子)的起止位置
                            }
                        }
                        //不利用蛇或梯子
                        if( deal==0 && grid[j+k]==0 )  grid[j+k] = 1;
                    }
                }
                step++;    //骰子数加一
            }
            printf( "%d
    ", step );
        }
        return 0;
    }
  • 相关阅读:
    Django ——Timezone 处理
    orm
    MySql系列之初识
    python并发编程之IO模型
    并发编程之协程
    GIL解释锁及进程池和线程池
    线程的互斥锁、递归锁及信号量
    守护、互斥锁、IPC和生产者消费者模型
    并发编程基础(进程)
    网络编程
  • 原文地址:https://www.cnblogs.com/Deng1185246160/p/3222503.html
Copyright © 2011-2022 走看看