文字列入力のスキルと落とし穴

ヒント 1

スペースを含む文字列の行を入力してください。gets の代わりに getline を使用してください

文字列 asd; 

getline(cin、asd);

ヒント 2

2 つの整数 n m を最初に入力し、次に n 行 m 列の途中にスペースなしで文字を入力する場合

char 配列を使用して 2 次元行列を定義し、cin>> を使用して入力します

ヒント 3

最初に整数 n を入力し、次にスペースを含む可能性のある文字列を n 行入力する場合、n を入力した後に getchar() を 2 つ追加する必要があります。そうしないと、エラーが発生します。

例:P1767ファミリー

#include <bits/stdc++.h>
using namespace std;
int n, m=200, len, ans;
int mx[5]={0, -1, 1, 0, 0};
int my[5]={0, 0, 0, -1, 1};
string s;
char a[110][210];
bool vis[110][210];
queue<int> qx, qy; 
void bfs(int x, int y)
{
	int nx, ny;
	qx.push(x);
	qy.push(y);
	while(!qx.empty()){
		x=qx.front();
		y=qy.front();
		qx.pop();
		qy.pop();
		for(int i=1; i<=4; ++i){
			nx=x+mx[i];
			ny=y+my[i];
			if(nx>=1 && nx<=n && ny>=1 && ny<=m && !vis[nx][ny] && a[nx][ny]>='a' && a[nx][ny]<='z'){
				vis[nx][ny]=true;
				qx.push(nx);
				qy.push(ny);
			}
		}
	}
	
}
int main()
{
	scanf("%d", &n);
	getchar();
	getchar();
	for(int i=1; i<=n; ++i){
		getline(cin, s);
		len=s.length();
		for(int j=1; j<=len; ++j){
			a[i][j]=s[j-1];
		}
		for(int j=len+1; j<=m; ++j){
			a[i][j]=' ';
		}
	}
	for(int i=1; i<=n; ++i){
		for(int j=1; j<=m; ++j){
			if(a[i][j]>='a' && a[i][j]<='z' && !vis[i][j]){
				ans++;
				vis[i][j]=true;
				bfs(i, j);
			}
		}
	}
	printf("%d", ans);
	return 0;
}

おすすめ

転載: blog.csdn.net/u013313909/article/details/127962073