研究BFS的最好方式是....
  • 板块P1767 家族
  • 楼主dienter
  • 当前回复9
  • 已保存回复9
  • 发布时间2023/12/2 14:27
  • 上次更新2023/12/2 15:55:05
查看原帖
研究BFS的最好方式是....
933643
dienter楼主2023/12/2 14:27

A了这道题

#include<bits/stdc++.h>
#include<iostream>
#include<queue>
#include<stack>
#include<stdio.h>
#include<math.h>
using namespace std;
int n;
int ans=0;
int ma[305][305];
int l[305];
const int dx[]={0,1,0,-1,0};
const int dy[]={0,0,-1,0,1};
string u;
queue<pair<int,int> > q;
void bfs(int xx,int yy){
	q.push(make_pair(xx,yy));
	ma[xx][yy]=0;
	while(q.size()){
		int xxx=q.front().first;
		int yyy=q.front().second;
		q.pop();
		for(int i=1;i<=4;i++){
			int s=xxx+dx[i];
			int d=yyy+dy[i];
			if(s>=1&&s<=n&&d>=1&&d<=l[s]&&ma[s][d]==1){
				ma[s][d]=0;
				q.push(make_pair(s,d));
			}
		}
	}
}
signed main()
{
	//freopen("P1767.in","r",stdin);
	//freopen("P17671.out","w",stdout);
	cin>>n;
	getline(cin,u);
	for(int i=1;i<=n;i++){
		getline(cin,u);
		l[i]=u.size();
		for(int j=1;j<=l[i];j++){
			if(u[j-1]>='a'&&u[j-1]<='z'){
				ma[i][j]=1;
			}
		}
	}
	/*
	for(int i=1;i<=n;i++){
		for(int j=1;j<=l[i];j++){
			cout<<ma[i][j];
		}
		cout<<"\n";
	}*/
	for(int i=1;i<=n;i++){
		for(int j=1;j<=l[i];j++){
			if(ma[i][j]==1){
				bfs(i,j);
				ans++;
			}
		}
	}
	/*
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<vis[i][j]<<' ';
		}
		cout<<"\n";
	}*/
	cout<<ans;
	return 0;
}
/*
4
*zlw**pxh
l*zlwk*hx*
w*tyy**yyy
        zzl
*/

上面这个代码可以AC, 但是若把第22行的q.pop();挪到第31行即:


void bfs(int xx,int yy){
	q.push(make_pair(xx,yy));
	ma[xx][yy]=0;
	while(q.size()){
		int xxx=q.front().first;
		int yyy=q.front().second;
		q.pop();//here
		for(int i=1;i<=4;i++){
			int s=xxx+dx[i];
			int d=yyy+dy[i];
			if(s>=1&&s<=n&&d>=1&&d<=l[s]&&ma[s][d]==1){
				ma[s][d]=0;
				q.push(make_pair(s,d));
			}
		}
	}
}

变为



void bfs(int xx,int yy){
	q.push(make_pair(xx,yy));
	ma[xx][yy]=0;
	while(q.size()){
		int xxx=q.front().first;
		int yyy=q.front().second;
		for(int i=1;i<=4;i++){
			int s=xxx+dx[i];
			int d=yyy+dy[i];
			if(s>=1&&s<=n&&d>=1&&d<=l[s]&&ma[s][d]==1){
				ma[s][d]=0;
				q.push(make_pair(s,d));
			}
		}
		q.pop();//WA
	}
}

就会MLE.

蒟蒻写BFS第一次见这种情况,求大佬解答

2023/12/2 14:27
加载中...