背景:做题遇到,题目
农夫约翰的农场可以表示成N*M(1≤N≤100≤M≤100)个方格组成的矩形。由于近日的降雨,在约翰农场上的不同地方形成了池塘。每一个方格或者有积水('W')或者没有积水('.')。农夫约翰打算数出他的农场上共形成了多少池塘。一个池塘是一系列相连的有积水的方格,每一个方格周围的八个方格都被认为是与这个方格相连的。现给出约翰农场的图样,要求输出农场上的池塘数。
输入
第1行:由空格隔开的两个整数:N和M
第2..N+1行:每行M个字符代表约翰农场的一排方格的状态。每个字符或者是'W'或者是'.',字符之间没有空格。
输出
输出只有1行,输出约翰农场上的池塘数
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,b[101][101]={},out=0,a[101][101]={};
char linshi;
void lookfor(int numi,int numj){
if(a[numi][numj]==1&&b[numi][numj]==0){
b[numi][numj]=1;
lookfor(numi,numj+1);
lookfor(numi+1,numj);
lookfor(numi+1,numj+1);
}
}
int main(){
cin>>n,m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>linshi;
if(linshi=='W'){
a[i][j]=1;
}
}
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(b[i][j]==0){
lookfor(i,j);
out++;
}
}
}
return 0;
}
运行结果:没有办法下文的
之前是直接char二维数组的,后来出现问题变成char转成0 1两种,放到int二维数组里,结果没用
我的思路有问题?
输入
10 12
(字符串,加上我发不出去)
输出
3
谢谢
#include <bits/stdc++.h>
using namespace std;
void visit(vector<string> &a, int n, int m, int i, int j, char flag)
{
vector<pair<int, int>> coords;
a[i][j] = flag;
for (int u = -1; u <= 1; u++)
{
for (int v = -1; v <= 1; v++)
{
int x = i + u;
int y = j + v;
if ((x < 0 || x >= n) || (y < 0 || y >= m) || (x == i && y == j))
continue;
if (a[x][y] == 'W')
{
a[x][y] = flag;
coords.push_back({x, y});
}
}
}
for (auto [x, y] : coords)
visit(a, n, m, x, y, flag);
}
int main()
{
int n, m;
cin >> n >> m;
vector<string> a(n);
for (int i = 0; i < n; i++)
std::cin >> a[i];
int count = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (a[i][j] == 'W')
{
count++;
visit(a, n, m, i, j, '0' + count);
}
}
}
printf("%d\n", count);
return 0;
}
$ g++ -Wall -std=c++17 main.cpp
$ cat test.txt
10 12
......W.....
.W....WW....
.WW.........
..WW........
..W........
............
........WW..
........WWW.
...........W
...........W
$ cat test.txt | ./a.out
3
#include <bits/stdc++.h>
using namespace std;
int n,m,b[101][101]={0},out=0,a[101][101]={0};
char linshi;
void lookfor(int numi,int numj){
if(b[numi][numj]==1){
b[numi][numj]=0;
//8个方向
if(0<=numi-1)
lookfor(numi-1,numj+1);
if(0<=numj-1)
lookfor(numi+1,numj-1);
lookfor(numi,numj+1);
lookfor(numi+1,numj);
lookfor(numi+1,numj+1);
if(0<=numi-1&&0<=numj-1)
lookfor(numi-1,numj-1);
if(0<=numi-1)
lookfor(numi-1,numj);
if(0<=numj-1)
lookfor(numi,numj-1);
}
}
int main(){
cin>>n,cin>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>linshi;
if(linshi=='W'){
b[i][j]=1;
}
}
}
for(int i=0;i<=n;i++){
for(int j=0;j<=m;j++){
if(b[i][j]==1){
lookfor(i,j);
out++;
}
}
}
cout<<out;
return 0;
}
这样输入