1359:围成面积

#include<cstdio>
#include<iostream>
using namespace std;
const int sum=11;
int direct[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int a[sum][sum],queue[sum*sum][2];
int n,m,cnt=0,i;//cnt全局变量统计最终结果
bool trav[sum][sum];
void feedcnt(int x,int y)
{
    int  head=0,tail=1,x1,y1;        
    queue[1][0]=x;
    queue[1][1]=y;
    trav[x][y]=true;//入队队首给他搜索过的标记,省去再次搜索的时间
     cnt++;//首次入队计数
    while(head<tail)//头指针和尾指针重合队列为空
    {
        head++;//出队
        x=queue[head][0];
        y=queue[head][1];
        for(int i=0;i<4;i++)//这里的i没有用int导致了错误,全局变量与局部变量的大bug
        {
            x1=x+direct[i][0];
            y1=y+direct[i][1];
            if(x1<1||x1>n||y1<1||y1>m||a[x1][y1]||trav[x1][y1]==true)
                continue;
            ++tail;//入队
            queue[tail][0]=x1;
            queue[tail][1]=y1;        
            trav[x1][y1]=true; 
            cnt++;//本次入队计数
        }   
    }
}
void feed(int x,int y)
{
    int  head=0,tail=1,x1,y1;        
    queue[1][0]=x;
    queue[1][1]=y;
    trav[x][y]=true;//入队队首给他搜索过的标记,省去再次搜索的时间
    
    while(head<tail)//头指针和尾指针重合队列为空
    {
        head++;//出队
    
        x=queue[head][0];
        y=queue[head][1];
        for(int i=0;i<4;i++)//这里的i没有用int导致了错误,全局变量与局部变量的大bug
        {
            x1=x+direct[i][0];
            y1=y+direct[i][1];
            if(x1<1||x1>n||y1<1||y1>m||a[x1][y1]||trav[x1][y1]==true)
                continue;
            ++tail;//入队
            queue[tail][0]=x1;
            queue[tail][1]=y1;        
            trav[x1][y1]=true;         
        }   
    }
}
int main()
{
    freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取 
    freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中 
    int j;
    n=m=10;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++) cin>>a[i][j];
    for(j=1;j<=m;j++)      if(a[1][j]==0&&!trav[1][j]) feed(1,j);//feed与feedcnt实际是一个函数,为了逻辑清晰分成两个比较好
    for(j=1;j<=m;j++)      if(a[n][j]==0&&!trav[n][j]) feed(n,j); 
     for(i=1;i<=n;i++)      if(a[i][1]==0&&!trav[i][1]) feed(i,1);//这里i写成了j,找了半天,因为是复制的原因,没有发现,晕了
     for(i=1;i<=n;i++)      if(a[i][m]==0&&!trav[i][m]) feed(i,m);
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++) 
     if(a[i][j]==0&&!trav[i][j]) 
         feedcnt(i,j);
     cout<<cnt<<endl;
     fclose(stdin);//关闭重定向输入 
    fclose(stdout);//关闭重定向输出 
return 0;
}

猜你喜欢

转载自blog.csdn.net/u010583225/article/details/81670561