H - 机器人测试
Crawling in process...
Crawling failed
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
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
//因为-3可以过去-2不可以过去所以一些被-2,-3包围的数可以比喻成一些水池,例如nyist上的27题,求出每一个被包围的区域的值。
//在把-3当作通路找出从-1能到达的区域的最值。
AC代码 广搜
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int N,a[1005][1005],vis[1005][1005],val[1000000],num,Max;
int l[4]={1,-1,0,0},r[4]={0,0,1,-1};
struct node
{
int x,y,biao;
};
int check(int x,int y,int z)
{
if(z)
{
if(x>=1&&x<=N&&y>=1&&y<=N&&a[x][y]!=-2&&a[x][y]!=-3&&vis[x][y]==0)
return 1;
else
return 0;
}
else
{
if(x>=1&&x<=N&&y>=1&&y<=N&&a[x][y]!=-2)
return 1;
else
return 0;
}
}
void bfs(int s1,int s2,int p)
{
queue<node> q;
node now,next;
now.x=s1,now.y=s2,now.biao=p;
if(p)
{
val[num]+=a[s1][s2];
if(a[s1][s2]==-1)
val[num]+=1;
vis[s1][s2]=num;
}
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=now.x+l[i];
next.y=now.y+r[i];
next.biao=now.biao;
if(p)
{
if(check(next.x,next.y,next.biao))
{
val[num]+=a[next.x][next.y];
if(a[next.x][next.y]==-1)
val[num]+=1;
vis[next.x][next.y]=num;
q.push(next);
}
}
else
{
if(check(next.x,next.y,next.biao))
{
if(vis[next.x][next.y]&&val[vis[next.x][next.y]]>Max)
Max=val[vis[next.x][next.y]];
a[next.x][next.y]=-2;
q.push(next);
}
}
}
}
}
int main()
{
while(~scanf("%d",&N))
{
int i,j,s1,s2;
memset(vis,0,sizeof(vis));
memset(val,0,sizeof(val));
memset(a,0,sizeof(a));
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==-1)
{
s1=i,s2=j;
}
}
num=0;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(vis[i][j]==0&&a[i][j]!=-2&&a[i][j]!=-3)
{
num++;
bfs(i,j,1);
}
}
Max=0;
bfs(s1,s2,0);
printf("%d\n",Max);
}
}
#include<string.h>
#include<queue>
using namespace std;
int N,a[1005][1005],vis[1005][1005],val[1000000],num,Max;
int l[4]={1,-1,0,0},r[4]={0,0,1,-1};
struct node
{
int x,y,biao;
};
int check(int x,int y,int z)
{
if(z)
{
if(x>=1&&x<=N&&y>=1&&y<=N&&a[x][y]!=-2&&a[x][y]!=-3&&vis[x][y]==0)
return 1;
else
return 0;
}
else
{
if(x>=1&&x<=N&&y>=1&&y<=N&&a[x][y]!=-2)
return 1;
else
return 0;
}
}
void bfs(int s1,int s2,int p)
{
queue<node> q;
node now,next;
now.x=s1,now.y=s2,now.biao=p;
if(p)
{
val[num]+=a[s1][s2];
if(a[s1][s2]==-1)
val[num]+=1;
vis[s1][s2]=num;
}
q.push(now);
while(!q.empty())
{
now=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=now.x+l[i];
next.y=now.y+r[i];
next.biao=now.biao;
if(p)
{
if(check(next.x,next.y,next.biao))
{
val[num]+=a[next.x][next.y];
if(a[next.x][next.y]==-1)
val[num]+=1;
vis[next.x][next.y]=num;
q.push(next);
}
}
else
{
if(check(next.x,next.y,next.biao))
{
if(vis[next.x][next.y]&&val[vis[next.x][next.y]]>Max)
Max=val[vis[next.x][next.y]];
a[next.x][next.y]=-2;
q.push(next);
}
}
}
}
}
int main()
{
while(~scanf("%d",&N))
{
int i,j,s1,s2;
memset(vis,0,sizeof(vis));
memset(val,0,sizeof(val));
memset(a,0,sizeof(a));
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]==-1)
{
s1=i,s2=j;
}
}
num=0;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(vis[i][j]==0&&a[i][j]!=-2&&a[i][j]!=-3)
{
num++;
bfs(i,j,1);
}
}
Max=0;
bfs(s1,s2,0);
printf("%d\n",Max);
}
}