#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;
}
1359:围成面积
猜你喜欢
转载自blog.csdn.net/u010583225/article/details/81670561
今日推荐
周排行