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 }