P1162 填涂颜色

P1162 填涂颜色

  • 分析:根据题意,将由1组成的闭合圈内的所有数字改为0。因为是一个正方形矩阵,所以需要设定四个方位,设一个标记数组,先复制一份原数(原来是1就自动标记为1),从4个边缘开始找0,搜索过程中0标记为-1,然后在限定范围内进行搜索,如果遇到已标记的数,证明是1 撞到墙了或者已搜过了,全部搜索完之后就变成了除了闭合圈以内的0,其余所有数字都标记为了1或-1,最后将闭合圈以内的0以2的形式输出,其他按照原来的数输出。
  • #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    int n,a[31][31],b[31][31];
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1}; 
    struct node
    {
    	int x,y;
    }now;
    void bfs(int x,int y)
    {
    	queue<node> q;
    	q.push({x,y});
    	while(!q.empty())
    	{
    		now=q.front();
    		q.pop();
    		b[now.x][now.y]=-1;//已搜过 标记 
    		for(int i=0;i<4;i++)//四个方向搜索
    		{
    			int xx=now.x+dx[i];
    			int yy=now.y+dy[i];
    			if(xx>=1&&xx<=n&&yy>=1&&yy<=n&&b[xx][yy]>=0&&a[xx][yy]==0)
    			{//符合题意 
    				q.push({xx,yy});//新点放入队尾 
    				b[xx][yy]=-1;//并标记 
    			}	
    		}
    	}
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>a[i][j]; 
    			b[i][j]=a[i][j];
    		}  
    	} 
    	//从四个边缘找0 
    	for(int i=1;i<=n;i++)
    		if(a[1][i]==0) bfs(1,i);//第一行 
    	for(int i=1;i<=n;i++) 
    		if(a[i][1]==0) bfs(i,1);//第一列 
    	for(int i=1;i<=n;i++)
    		if(a[n][i]==0) bfs(n,i);//最后一行 
    	for(int i=1;i<=n;i++)
    		if(a[i][n]==0) bfs(i,n);//最后一列 
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			if(b[i][j]==-1) cout<<0<<" ";//在外面的0  
    			else if(b[i][j]==0) cout<<2<<" ";//被包裹的0 
    			else cout<<b[i][j]<<" ";//剩余的1 
    		}
    		cout<<endl;
    	}
    	return 0;
    }
  • 还有个代码是跟面积那题写的基本一样的,没从四个边缘搜索,是在矩阵外面加了一圈0。
  • 但是.....在洛谷通过 在码学堂错一个数据......
  • #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    int n,a[31][31],b[31][31];
    int dx[4]={1,-1,0,0};
    int dy[4]={0,0,1,-1}; 
    struct node
    {
    	int x,y;
    }now;
    void bfs(int x,int y)
    {
    	queue<node> q;
    	q.push({x,y});
    	while(!q.empty())
    	{
    		now=q.front();
    		q.pop();
    		for(int i=0;i<4;i++)//四个方向搜索
    		{
    			int xx=now.x+dx[i];
    			int yy=now.y+dy[i];
    			if(xx>=0&&xx<=n+1&&yy>=0&&yy<=n+1&&b[xx][yy]==0&&a[xx][yy]==0)
    			{//符合题意 
    				q.push({xx,yy});//新点放入队尾 
    				b[xx][yy]=1;//并标记 
    			}	
    		}
    	}
    }
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{
    			cin>>a[i][j]; 
    			b[i][j]=a[i][j];
    		}  
    	} 
    	//b[0][0]=1;
    	bfs(0,0);
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=n;j++)
    		{ 
    			if(b[i][j]==0) cout<<2<<" ";//被包裹的0 
    			else cout<<a[i][j]<<" ";//剩余的1 
    		}
    		cout<<endl;
    	}
    	return 0;
    }
posted @ 2022-08-24 14:41  4lovls  阅读(155)  评论(0)    收藏  举报