玄关!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

P1162 填涂颜色

@[lty2023](/user/1037200) 什么题啊,看起来好难 哦,原来我做过啊,那还好…… 废话不多说,看代码: ```c #include <bits/stdc++.h> using namespace std; typedef long long l; l n; // 地图的边长 l ways[35][35] = {2}; // 地图的数据,默认将所有的数据初始化为2 l dx[4] = {-1, 1, 0, 0}, dy[4] = {0, 0, 1, -1}; // x坐标和y坐标的偏移值 void bfs(l x, l y) { queue<pair<l, l>> q; q.push(pair<l, l>{x, y}); ways[x][y] = 0; while (!q.empty()) { l tx, ty; // 偏移后的x坐标与y坐标 pair<l, l> front = q.front(); for (int i = 0; i < 4; i ++) { tx = front.first + dx[i]; ty = front.second + dy[i]; if (tx > 0 && tx <= n + 2 && ty > 0 && ty <= n + 2) { // 判断边界(给边缘扩大了一圈) if (ways[tx][ty] == 2) { ways[tx][ty] = 0; q.push(pair<l, l>{tx, ty}); } } } q.pop(); // 弹出队列 } return; // 完结撒花 } int main () { cin >> n; // 输入地图的边长 for (int i = 0; i < 35; i ++) for (int j = 0; j < 35; j ++) ways[i][j] = 2; for (int i = 2; i <= n + 1; i ++) { // 输入地图数据 for (int j = 2; j <= n + 1; j ++) { cin >> ways[i][j]; if (ways[i][j] == 0) ways[i][j] = 2; // 将所有的0变成2 } } bfs(1, 1); // 坐标需从1开始(毕竟整个地图都扩大了一圈了) for (int i = 2; i <= n + 1; i ++) { // 输出地图 for (int j = 2; j <= n + 1; j ++) { cout << ways[i][j] << ' '; } cout << endl; } return 0; } ``` ~~求关~~
by jzm0708 @ 2024-08-24 15:26:41


如果在下掏出这样的样例,阁下该如何应对呢 ``` 5 0 1 0 1 0 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 0 1 1 1 0 ``` @[lty2023](/user/1037200)
by xiexinxin @ 2024-08-24 15:30:05


@[lty2023](/user/1037200) 要把边界全判断一遍,在你的代码上改的。 ```cpp #include<bits/stdc++.h> using namespace std; int n,a[31][31]; void f(int x,int y){ if(a[x][y]==1||a[x][y]==0||x<0||y<0||x>=n||y>=n){ return; } a[x][y]=0; f(x+1,y); f(x,y+1); f(x-1,y); f(x,y-1); } int main(){ cin>>n; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; if(a[i][j]==0){ a[i][j]=2; } } } for(int i=0;i<n;i++) f(0,i),f(i,0),f(n-1,i),f(i,n-1); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<a[i][j]<<" "; } cout<<endl; } } ```
by XuZile @ 2024-08-24 15:31:05


@[lty2023](/user/1037200) 有可能遇到以上有一些0被断开的情况,所以要从外面一层开始
by xiexinxin @ 2024-08-24 15:31:41


过了,全关注了
by lty2023 @ 2024-08-24 15:37:25


|