B. Spotlights

点击打开链接

说实话  这个题 要是不是我看样例死推 公式  或许 我真的就看不懂  这个题的意思了 这个题的意思就是  只要  在 0处 然后 上下左右有个 1(只要是方向上就行 不需要 紧挨着)  然后就加1(一个方向最多加 1) 这个题我又t 了对 很坑的一道题 你只能 一个一个的找规律  哎!!!  详细思路可以参考一下 代码  

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <math.h>
#include <vector>
#include <map>
#include <set>
using namespace std;
int p[1050][1050];
int main()
{
    int n,m,sum=0;
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            scanf("%d",&p[i][j]);
    int xx=1,yy=1,flag=0;
    for(int i=1; i<=n; i++)
    {
        flag=0;
        xx=1;
        for(int j=1; j<=m; j++)
        {
            while(p[i][xx]==0&&xx<=m)
            {
                xx++;
            }
            if(xx==m+1&&p[i][m]!=1)
            {    if(flag==0)
                   break;
                 sum+=xx-j;
                 break;
            }
            //printf("%d %d\n",xx,j);
            if(flag)
                sum+=(xx-j)*2;
            else
                sum+=(xx-j);
               //  printf("%d %d\n",flag,sum);
            xx=xx+1;
            j=xx-1;
            flag=1;


        }

    }
    for(int i=1; i<=m; i++)
    {
        flag=0;
        yy=1;
        for(int j=1; j<=n; j++)
        {
            while(p[yy][i]==0&&yy<=n)
            {
                yy++;
            }
             if(yy==n+1&&p[n][i]!=1)
             {    if(flag==0)
                    break;
                 sum+=yy-j;
                 break;
             }
            if(flag)
                sum+=(yy-j)*2;
            else
                sum+=yy-j;
            yy=yy+1;
            j=yy-1;
            flag=1;
        }
       //printf("%d\n",sum);
    }
    printf("%d\n",sum);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值