poj1111

#include <iostream>
#include <stdio.h>

using namespace std;

int a[30][30],b[30][30],n,m,x,y,que[900][2],f,r;
int dicx[8]={1,1,1,0,0,-1,-1,-1},
    dicy[8]={-1,0,1,-1,1,-1,0,1},
    dx[4]={1,-1,0,0},
    dy[4]={0,0,1,-1};

int main()
{   int i,j,xx,yy,k,sum;
    char w;
    //freopen("in.txt","r",stdin);
    cin>>m>>n>>x>>y;
    while (m+n+x+y>0)
   {for (i=0;i<=m+1;i++)
        for (j=0;j<=n+1;j++)
        {
            a[i][j]=0;
            b[i][j]=0;
        }
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
        {
            cin>>w;
            if (w=='X') a[i][j]=1;
        }
    for (i=0;i<900;i++)
        for (j=0;j<=1;j++) que[i][j]=0;
    f=1;r=1;que[1][0]=x;que[1][1]=y;a[x][y]=-1;//入队,做标记
    while (f<=r)
    {   //for (i=1;i<=r;i++) cout<<que[i][0]<<" "<<que[i][1]<<endl;cout<<endl;
        xx=que[f][0];yy=que[f][1];     
        //a[xx][yy]=-1;
        for (k=0;k<8;k++)   //各个方向
            if (xx+dicx[k]>=1&&xx+dicx[k]<=m&&yy+dicy[k]>=1&&yy+dicy[k]<=n
               &&a[xx+dicx[k]][yy+dicy[k]]==1)  //没越界没走过
            {
                r++;                     //入队,做标记
                a[xx+dicx[k]][yy+dicy[k]]=-1;
                que[r][0]=xx+dicx[k];
                que[r][1]=yy+dicy[k];
            }
        f++;
    }
    //for (i=1;i<=m;i++){for (j=1;j<=n;j++) cout<<a[i][j]<<" ";cout<<endl;}
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++)
            if (a[i][j]==-1)
            {
               b[i][j]=4;
               for (k=0;k<4;k++) //有一个相邻的x,就减少一条边
               if (a[i+dx[k]][j+dy[k]]==-1) b[i][j]--;
            }
    sum=0;
    for (i=1;i<=m;i++)
        for (j=1;j<=n;j++) sum+=b[i][j];    //总边数及周长
    cout<<sum<<endl;
    cin>>m>>n>>x>>y;
   }
    return 0;
}

题意: 先输入一个矩阵,再输入一个X的位置,然后输出与这个X在八个方向能够连起来的所有X组成的图形的周长。

思路:宽搜,求出能连在一起的x,假设每个要4条线围起来,有一个相邻的x,就减少一条边

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值