70分,DFS+连通块思路求助
查看原帖
70分,DFS+连通块思路求助
538085
liysjianttso楼主2023/5/27 21:53

我用的是DFS+连通块答案相同的思路,但是可能是我代码哪里有问题,改来改去还是只有70分

关于连通块的思路是每找到一个连通块就把他的坐标存在vector里,回到main之后统一把所有联通换换成一个答案(连通块答案相同)

但是这样搞好象花的时间和空间反而变多了

希望各位大佬帮忙看看,感激不尽

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;
int n,m;
struct node{
	int x,y;
};
int tans = 1;   //用于存放每一次dfs最终结果的临时答案变量
vector<node> v; //存放dfs过程中找到的连通块
int ans[3000][3000];    //答案
char c[3000][3000];     //地图
int vis[3000][3000];
int dir[4][2] = {1,0,-1,0,0,-1,0,1};
void dfs(int x,int y){
	int nx,ny;
	char ma = c[x][y];
	for(int i = 0;i<8;i++){
		nx = x+dir[i][0];
		ny = y+dir[i][1];
		if(nx<0||ny<0||nx>n-1||ny>n-1||vis[nx][ny])continue;
		char m1 = c[nx][ny];
		if(ma=='1'&&m1!='0')continue;
		if(ma=='0'&&m1!='1')continue;
		vis[nx][ny] = 1;
		v.push_back((node){nx,ny});//将这个连通块坐标放入vector
		tans++;//临时答案加一
		dfs(nx,ny);
	}
}
int main(){
	memset(ans,-1,sizeof ans);//答案初始化为-1以便记忆化
	scanf("%d%d",&n,&m);
	for(int i  =0;i<n;i++){
		scanf("%s",c[i]);
	}
	for(int i = 0;i<m;i++){
		v.clear();
		tans=1;
		int x,y;
		memset(vis,0,sizeof vis);
        //以上是初始化
		scanf("%d%d",&x,&y);
		x--;y--;
		if(ans[x][y]!=-1){
            //记忆化,如果它处在一个连通块就直接输出
			printf("%d\n",ans[x][y]);
			continue;
		}
		v.push_back((node){x,y});
		vis[x][y] = 1;
		dfs(x,y);
		for(int i = 0;i<v.size();i++){
            //都是连通块,答案相同
			ans[v[i].x][v[i].y] = tans;
		}
		printf("%d\n",ans[x][y]);
	}
}
2023/5/27 21:53
加载中...