LeetCode |Surrounded Regions

    xiaoxiao2025-05-26  12

    Given a 2D board containing ‘X’ and ‘O’ (the letter O), capture all regions surrounded by ‘X’.

    A region is captured by flipping all ‘O’s into ‘X’s in that surrounded region.

    For example, X X X X X O O X X X O X X O X X After running your function, the board should be:

    X X X X X X X X X X X X X O X X

    这道题一直过不去… 网上的dfs代码是过不去的,最新的用例似乎加强了数据。 用BFS的话,无论我申明了struct或者是使用pair,全部超内存。。。 唯一一个过了的是使用c++的Lamda表达式的,这个可以提升效率? 有哪路大神知道的话给指点指点。

    class Solution { public: struct Pos{ int x,y; Pos(int vx,int vy) : x(vx), y(vy) {} }; //四个方向 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int m,n;//矩阵大小 void solve(vector<vector<char> >& board) { this->m=board.size(); if(m==0) return; this->n=board[0].size(); for(int i=0;i<m;i++){ if(board[i][0]=='O') dfs(i,0,board); if(board[i][n-1]=='O') dfs(i,n-1,board); } for(int i=0;i<n;i++){ if(board[0][i]=='O') dfs(0,i,board); if(board[m-1][i]=='O') dfs(m-1,i,board); } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(board[i][j]=='O') board[i][j]='X'; else if(board[i][j]=='+') board[i][j]='O'; } } } void dfs(int x,int y,vector<vector<char> >& board){ int i=x,j=y; if(board[i][j]=='O'){ board[i][j]='+'; for(int i=0;i<4;i++){ int next_x=x+dir[i][0]; int next_y=y+dir[i][1]; //越界 if(next_x<0 || next_x>=m || next_y<0 ||next_y>=n) continue; dfs(next_x,next_y,board); } } } //通过bfs,从x行y列开始寻找能否走出迷宫 void bfs(int x,int y,vector<vector<char> >& board){ // int visit[m][n]; // memset(visit,0,sizeof(visit)); queue<Pos*> Q; Pos *p=new Pos(x,y); Q.push(p); while(!Q.empty()){ Pos *p=Q.front(); Q.pop(); board[p->x][p->y]='+'; //如果type为1,表示要填充所有遍历到的节点为X // if(type==1) board[p->x][p->y]='X'; // else{ //判断是否是边界 // if(p->x==0 || p->y==0 || p->x==m-1 || p->y==n-1){ // flag=true; // // return true; // } // } for(int i=0;i<4;i++){ int next_x=p->x+dir[i][0]; int next_y=p->y+dir[i][1]; //越界 if(next_x<0 || next_x>=m || next_y<0 ||next_y>=n) continue; //判重 // if(visit[next_x][next_y]) continue; //只能走O if(board[next_x][next_y]!='O') continue; // printf("pos %d %d\n",) //符合条件推入队列 // visit[next_x][next_y]=1; Q.push(new Pos(next_x,next_y)); } } // //如果flag=true表明Q2里的节点都是与边界相连的 // //为false表示从当前一点不能到达边界,应当全部置为X // if(!flag){ // while(!Q2.empty()){ // Pos *p=Q2.front(); // Q2.pop(); // board[p->x][p->y]='X'; // } // } // return false; } /* void solve(vector<vector<char> >& board) { this->m=board.size(); if(m==0) return; this->n=board[0].size(); for(int i=0;i<m;i++){ if(board[i][0]=='O') bfs(i,0,board); if(board[i][n-1]=='O') bfs(i,n-1,board); } for(int i=0;i<n;i++){ if(board[0][i]=='O') bfs(0,i,board); if(board[m-1][i]=='O') bfs(m-1,i,board); } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(board[i][j]=='O') board[i][j]='X'; else if(board[i][j]=='+') board[i][j]='O'; } } // //遍历整个面板 // for(int i=0;i<m;i++){ // for(int j=0;j<n;j++){ // //如果找到一个O // //则需要判断这个O是否被X包围 // //被X包围的标志是从该点出发,无法到达迷宫边缘 // // if(board[i][j]=='O'){ // // //判断是否被包围 true表示没有被包围 // // if(!bfs(i,j,board,0)){ // // // printf("pos %d %d\n",i,j); // // //表示bfs没有走到边界的地方 // // //那么这些区域应当被填充上X // // bfs(i,j,board,1); // // } // // } // if(board[i][j]=='O') // bfs(i,j,board); // } // } // for(int i=0;i<m;i++){ // for(int j=0;j<n;j++){ // if(board[i][j]=='+') // board[i][j]='O'; // } // } }*/ };
    转载请注明原文地址: https://ju.6miu.com/read-1299285.html
    最新回复(0)