• FZU Problem 1491 机器人测试(BFS)


    Problem Description

    为了测试我们的足球机器人的性能,我们设计如下的测试方法:

    将一个机器人放在一个n*n的矩形阵列的某个格子中,它每次可以向与它所处的格子相邻的4个格子中的任何一个移动。

    在这个阵列的一些格子中,摆放着能量,机器人希望能够得到这些能量。但是,这个阵列中存在着两种障碍物,一种障碍物使得机器人无法向前移动进入这个 格子;第二种障碍物机器人虽然可以通过,但是,通过这样一个障碍物的时候,它先前所吃到的所有的能量都将消失。你的任务是,对于给定的一个阵列以及它的描 述,计算出这个机器人所能够获得的最大能量值。

    Input

    本题有多组输入数据,你必须处理到EOF为止

    输入数据的第一行表示输入矩阵的维数n,接下来n行,每行有n个元素,给出一个n*n的矩阵(n<=1000)。这个矩阵中,0表示这个格子 上什么都没有,-1是机器人开始的位置,-2表示的是第一种障碍物,-3表示的是第2种障碍物。其他非负整数值表示的是能量的数值。

    Output

    输出仅一行,表示机器人所能获得的最大能量。

    我们保证最后结果在[0, 230]的范围内。

    Sample Input

    4
    10000 -2 0 0
    -2 1 -1 0
    -3 -3 0 0
    1000 -3 0 0

    Sample Output

    1000

    Source

    福州大学第四届程序设计竞赛

    思路:开始每个点都遍历以-2,-3作为墙,记录一个相连的区域(以水池比喻)总的值,标记为水池 i 。标记完后从-1开始在遍历,这时-3是通路,-2是墙,看能遍历到那个水池的值最大,记录输出。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<queue>
     4 #include<conio.h>
     5 #include<cstring>
     6 using namespace std;
     7 int map[1002][1002];
     8 int vis[1002][1002];
     9 int val[1000001];
    10 int N,Num,Max;
    11 int dir[][2] = {-1,0,0,1,1,0,0,-1};
    12 struct Point
    13 {
    14     int x,y;
    15     int flag;
    16 };
    17 bool Check(int x,int y,int F)
    18 {
    19     if( x < 0 || x >= N || y < 0 || y >= N)
    20         return 1;
    21     if( F && vis[x][y] )
    22         return 1;
    23     if(map[x][y] == -2 )
    24         return 1;
    25     if( F && map[x][y] == -3 )
    26         return 1;
    27     return 0;
    28 }
    29 void BFS(int x,int y,int F)
    30 {
    31     queue<Point> Que;
    32     Point P,Q;
    33     P.x = x; P.y = y; P.flag = F;
    34     Que.push(P);
    35     if(F){
    36         val[Num] = map[x][y];
    37         if(map[x][y] == -1)
    38             val[Num] += 1;
    39         vis[x][y] = Num;
    40     }
    41     while( !Que.empty()){
    42         P = Que.front();
    43         Que.pop();
    44         for(int i=0; i<4; i++){
    45             Q.x = P.x + dir[i][0];
    46             Q.y = P.y + dir[i][1];
    47             Q.flag = P.flag;
    48             if(P.flag){
    49                 if( !Check(Q.x,Q.y,1) )//不出界、未遍历过、不是-2、-3
    50                 {
    51                     val[Num] += map[Q.x][Q.y];//该水池的值
    52                     if(map[Q.x][Q.y] == -1)
    53                         val[Num] += 1;//经过则起点加一
    54                     vis[Q.x][Q.y] = Num;//标记第几个水池
    55                     Que.push(Q);//入队
    56                 }
    57             }
    58             else{
    59                 if( !Check(Q.x,Q.y,0) )//不是-2、墙时
    60                 {
    61                     if( vis[Q.x][Q.y] && val[vis[Q.x][Q.y]] > Max )
    62                         Max = val[vis[Q.x][Q.y]];
    63                     map[Q.x][Q.y] = -2;//把走过的路变为墙
    64                     Que.push(Q);
    65                 }
    66             }
    67         }
    68     }
    69 }
    70 int main()
    71 {
    72     int i,j;
    73     int start_x,start_y;
    74     while(~scanf("%d",&N))
    75     {
    76         for(i=0; i<N; i++)
    77             for(j=0; j<N; j++){
    78                 scanf("%d",&map[i][j]);
    79                 if(map[i][j] == -1){
    80                     start_x = i;
    81                     start_y = j;
    82                 }
    83             }
    84         Num = 0;
    85         memset(vis,0,sizeof(vis));
    86         memset(val,0,sizeof(val));
    87         for(i=0; i<N; i++)
    88             for(j=0; j<N; j++){
    89                 if( !vis[i][j] && map[i][j] != -2 && map[i][j] != -3    ){
    90                     Num++;
    91                     BFS(i,j,1);
    92                 }
    93             }
    94         Max = 0;
    95         BFS(start_x,start_y,0);
    96         cout<<Max<<endl;
    97     }
    98     return 0;
    99 }
    View Code
  • 相关阅读:
    2020-03-15助教一周小结(第五周)
    2020-03-08助教一周小结(第四周)
    2020-03-01 助教一周小结(第三周)
    助教一周小结(第二周)
    2020-02-16 助教一周小结(第一周)
    201771010135 杨蓉庆《面对对象程序设计(java)》第十二周学习总结
    201771010135 杨蓉庆AND张燕 《面对对象程序设计(java)》第十一周学习总结
    201771010135 杨蓉庆《面对对象程序设计(java)》第十周学习总结
    201771010135杨蓉庆 《面对对象程序设计(java)》第九周学习总结
    201771010135杨蓉庆 《面对对象程序设计(java)》第八周学习总结
  • 原文地址:https://www.cnblogs.com/qiu520/p/3250095.html
Copyright © 2020-2023  润新知