填涂颜色
思路: 建立数组xx和数组yy, 分别表示每一次操作横纵坐标的对应长度。
将输入的方阵外面加上一圈0,第一个入队.
然后从涂色的最开始(队首)向周围扩展,若扩展到的点在棋盘里且没有被搜到标记过,就入队并标记。
当队首向外扩展完了,让当前队首出队,再由下一个队首继续向外扩展寻找.
输出时分2种情况输出.一种是如果没被访问且值为0的,输出2;剩下的输出它本身的值。
代码如下:
#include<iostream>
#include<queue>
int xx[]={0,-1,0,1};//方向
int yy[]={1,0,-1,0};//xy要对应
int map[40][40];//存数
bool vis[40][40];//记录是否访问过
int n;
using namespace std;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//读入方阵
for(int j=1;j<=n;j++)
cin>>map[i][j];
//建队列
queue<int>x;//横坐标
queue<int>y;//纵坐标
x.push(0);y.push(0);//加上一圈0,从0开始
vis[0][0]=1;//记录,防止再访问回来
while(!x.empty())//队列不为空时
{
for(int i=0;i<4;i++)//点对应的四个方向
{
int dx=x.front()+xx[i];//队首点对应的4个方向的点的横坐标
int dy=y.front()+yy[i];//队首点对应的4个方向的点的纵坐标
if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&map[dx][dy]==0&&vis[dx][dy]==0)//新的点在边界内且没被访问过,加了一圈0所以边界变大
{
x.push(dx);//把点压进队
y.push(dy);
vis[dx][dy]=1;//标记
}
}
x.pop();//原来的队首出队
y.pop();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++){
if(map[i][j]==0&&vis[i][j]==0)//值是0且没有被访问过
cout<<"2";
else
cout<<map[i][j];
cout<<" ";
}
cout<<endl;
}
return 0;
}
标签:填涂,颜色,cout,int,40,vis,dx,dy From: https://www.cnblogs.com/xdzxyingrui/p/16620892.html