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,就減少一條邊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章