这不是大水题嘛。
大概这样。
#define N 1000
bool vis[N][N];
vector<pair<int,int> > ans;
memset(vis,false,sizeof(vis));
void dfs(int x,int y,int v){
if (valid_pos(x,y)) return;
if (vis[x][y] || a[x][y]!=v) return;
vis[x][y]=true;
ans.push_back(make_pair<int,int> );
dfs(x+1,y,val);
dfs(x-1,y,val);
dfs(x,y-1,val);
dfs(x,y+1,val);
}