题目描述
由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6×66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
思路:
对于任意一个点,以该店为中心向四周搜索,把走过的路径存在栈里,如果都存在‘1’,则是被围的数字,有一个不是则不是。每一个点的搜索结束后,用另外一个矩阵标记搜索过的点,把圈内的点更新为2,然后寻找下一个要搜索的中心点。搜索都是以搜索到‘1’或者搜索到边界为结束,如果遇到已经搜索过的点会再对它进行一遍搜索。
输入输出格式
输入格式:
每组测试数据第一行一个整数n(1≤n≤30)n(1≤n≤30)
接下来nn行,由00和11组成的n×nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:
已经填好数字22的完整方阵。
输入输出样例
输入样例#1: 复制
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
输出样例#1: 复制
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
说明
1≤n≤301≤n≤30
#include <bits/stdc++.h>
using namespace std;
int n;
typedef struct{
int pos[2]; // pos[0]是x坐标 pos[1]是y坐标
}point;
typedef vector<bool> brow;
typedef vector<int> row;
vector<brow>f;
vector<row>mat;
stack<point>stap;
void adjust(bool t){ //对于栈内存的点进行标记处理
while (!stap.empty()) {
point p = stap.top();
f[p.pos[0]][p.pos[1]]=true;
if(t)mat[p.pos[0]][p.pos[1]]=2;
stap.pop();
}
}
point jump(point p){ //寻找下一个搜索中心点
int a=p.pos[0],b=p.pos[1];
for(;a<n&&(f[a][b]||mat[a][b]==1);a++){
b=0;
for (; b<n&&(f[a][b]||mat[a][b]==1); b++){
if(mat[a][b]==1)f[a][b]=true;
if(b==n-1){
b=0;break;
}
}
if(!f[a][b])break;
}
p={a,b};
return p;
}
bool direction(int pos,int d,point p){ 向四周进行搜索的函数
bool dir =false;
while (p.pos[0]<n&&p.pos[0]>=0&&p.pos[1]<n&&p.pos[1]>=0) {
if(mat[p.pos[0]][p.pos[1]]==1){
dir=true;
break;
}
stap.push(p);
p.pos[pos]+=d;
}
return dir;
}
int main() {
cin>>n;
f= vector<brow>(n,vector<bool>(n,false));
mat=vector<row>(n,vector<int>(n,0));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&mat[i][j]);
point p{0,0};
while (p.pos[0]<n&&p.pos[1]<n&&!f[p.pos[0]][p.pos[1]]) {
stap = stack<point>();
bool up=direction(0, -1, p),down=direction(0, 1, p),
right=direction(1, 1, p),left=direction(1, -1, p);
adjust(up&&down&&right&&left);
p= jump(p);
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++)
if(j!=n-1)printf("%d ",mat[i][j]);
else printf("%d",mat[i][j]);
printf("\n");
}
return 0;
}