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
原文地址:https://www.cnblogs.com/qiu520/p/3250095.html