一.小知识点
1.何时需要getchar()接收换行符?-->使用%c输入字符时要考虑
用户打完数据按下Enter键后,数据和换行符都在缓冲区中。输入语句 是从 缓冲区 中 依次 取 数。如果读取字符,则换行符是第一个读取的。
getchar():读取缓冲区的第一个字符,并在屏幕上显示。
1>不需要的:
a.scanf("%s", str) //一个scanf后的确有回车在缓冲区里,但是这个会把之前留下的换行符无视掉
b.gets()
2>需要的:输入%c时
a.前面输入一个东西,紧接着要读取字符
b.输入一维数组
c.输入二维数组
二.题目
三.代码
#include<bits/stdc++.h>
using namespace std;
#define N 1111
char ch[N][N];
int energy;
int vis[N][N];
int n,m;
void dfs(char c,int x,int y){
int i;
if(x-1>=0){
i=x-1;
if(vis[i][y]==0&&ch[i][y]==c){
vis[i][y]=1;
dfs(c,i,y);
}
}
if(y-1>=0){
i=y-1;
if(vis[x][i]==0&&ch[x][i]==c){
vis[x][i]=1;
dfs(c,x,i);
}
}
if(x+1<m){
i=x+1;
if(vis[i][y]==0&&ch[i][y]==c){
vis[i][y]=1;
dfs(c,i,y);
}
}
if(y+1<n){
i=y+1;
if(vis[x][i]==0&&ch[x][i]==c){
vis[x][i]=1;
dfs(c,x,i);
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
//TODO
int i,j,k;
scanf("%d %d",&n,&m);
getchar();
for(i=0;i<n;i++){
for(j=0;j<m;j++){
vis[i][j]=0;
scanf("%c",&ch[i][j]);
}
getchar();
}
energy=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
//TODO
if(vis[i][j]==0){
energy++;
vis[i][j]=1;
dfs(ch[i][j],i,j);
}
}
}
printf("%d\n",energy);
}
return 0;
}