FZU-1491- 机器人测试

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值