我用的是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]);
}
}