说实话 这个题 要是不是我看样例死推 公式 或许 我真的就看不懂 这个题的意思了 这个题的意思就是 只要 在 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;
}