版权声明:如需转载,私聊博主 https://blog.csdn.net/lylzsx20172018/article/details/91400452
前提:越基础的知识,越不要眼高手低
题目链接:https://cn.vjudge.net/contest/306123#problem/G
题目要求:求‘@’的连通块有几个,总共8个方向搜
dfs代码:
#include<cstdio>
#include<cstring>
char a[102][102];
int to[8][2]= {0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1};
int n,m;
void dfs(int x,int y){
for(int i=0; i<8; i++){
int tx=x+to[i][0];
int ty=y+to[i][1];
if(tx<0||tx>=n||ty<0||ty>=m||a[tx][ty]=='*')
continue;
a[tx][ty]='*';
dfs(tx,ty);
}
return;
}
int main(){
while(~scanf("%d %d",&n,&m)&&(n+m)){
int sum=0;
for(int i=0; i<n; i++)
scanf("%s",a[i]);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(a[i][j]=='@'){
a[i][j]='*'; //a[i][j]='*'和dfs(i,j)可以互换
dfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
bfs(用head和tail模拟)代码:
#include<cstdio>
#include<cstring>
int book[102][102];
char a[102][102];
int to[8][2]= {0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1};
int n,m;
struct node {
int x,y;
} s[10005];
void bfs(int x,int y) {
book[x][y]=1;
int head=1,tail=1;
s[head].x=x;
s[head].y=y;
tail++;
while(head<tail) {
for(int i=0; i<8; i++) {
int tx=s[head].x+to[i][0]; //这个地方要注意
int ty=s[head].y+to[i][1];
if(book[tx][ty]==0&&a[tx][ty]=='@'&&tx>=0&&tx<n&&ty>=0&&ty<m) {
s[tail].x=tx;
s[tail].y=ty;
book[tx][ty]=1;
tail++;
}
}
head++;
}
}
int main() {
while(~scanf("%d %d",&n,&m)&&(n+m)) {
int sum=0;
memset(book,0,sizeof(book));
for(int i=0; i<n; i++)
scanf("%s",a[i]);
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(a[i][j]=='@'&&book[i][j]==0) {
bfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
bfs(用队列模拟):
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
struct node {
int x;
int y;
};
char a[102][102];
int to[8][2]= {0,1,1,1,1,0,1,-1,0,-1,-1,-1,-1,0,-1,1};
int book[102][102];
int n,m;
void bfs(int x,int y) {
book[x][y]=1;
queue<node>q;
node u,v;
u.x=x;
u.y=y;
q.push(u);
while(!q.empty()) {
u=q.front();
q.pop();
for(int i=0; i<8; i++) {
int tx=u.x+to[i][0];
int ty=u.y+to[i][1];
if(tx<0||tx>=n||ty<0||ty>=m||a[tx][ty]=='*'||book[tx][ty]==1)
continue;
book[tx][ty]=1;
v.x=tx,v.y=ty;
q.push(v);
}
}
}
int main() {
while(~scanf("%d %d",&n,&m)&&(n+m)) {
memset(book,0,sizeof(book));
int sum=0;
for(int i=0; i<n; i++)
scanf("%s",a[i]);
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(book[i][j]==0&&a[i][j]=='@') {
bfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
在学习新的知识的路上,要经常复习,才能做到游刃有余