元の公開番号:bigsaiウェルカムトゥフォーススナップパンチの
記事がネットワーク全体に含まれているデータ構造とアルゴリズムについて懸念しているウェアハウスウェルカムスターを学ぶ
タイトル説明
「X」と「O」(文字O)を含む2次元行列が与えられます。
「X」で囲まれたすべての領域を見つけ、これらの領域のすべての「O」を「X」で埋めます。
例:
X X X X
X O O X
X X O X
X O X X
関数を実行すると、行列は次のようになります。
X X X X
X X X X
X X X X
X O X X
説明:
囲まれた間隔は境界に存在しません。つまり、どの境界の「O」も「X」で埋められません。境界上にない、または境界上の「O」に接続されていない「O」は、最終的に「X」で埋められます。2つの要素が水平方向または垂直方向に隣接している場合、それらは「接続されている」と言われます。
分析
質問の意味は理解しやすいです。つまり、エッジに接続されているOだけがXで囲まれず、他のOだけがXで囲まれます。
これはグラフ理論の検索の質問です。コア処理のアイデアは、行列のすべてのエッジから開始し、xの場合はスキップし、oの場合はスキップし、ポイントの上下に接続されたポイントの検索を開始することです。左、右にマークを付けます(マークは囲まれていないことを意味します)。そして最後に、残りのマークされていないノードは予約されます。他のすべてのノードはxになります。
特定の処理では、dfsまたはbfsを使用できます。移動するときは、範囲を超えないように注意してください。
特定のコード:
class Solution {
int X[]={
0,1,0,-1};
int Y[]={
1,0,-1,0};
public void solve(char[][] board) {
int lenx=board.length,leny=board[0].length;
boolean jud[][]=new boolean[lenx][leny];
for(int i=0;i<lenx;i++)//两个竖得
{
if(board[i][0]=='O'&&!jud[i][0])
{
judgle(i,0,board,jud);
jud[i][0]=true;
}
if(board[i][leny-1]=='O'&&!jud[i][leny-1])
{
judgle(i,leny-1,board,jud);
jud[i][leny-1]=true;
}
}
for(int i=0;i<leny;i++)//两个横得
{
if(board[0][i]=='O'&&!jud[0][i])
{
judgle(0,i,board,jud);
jud[0][i]=true;
}
if(board[lenx-1][i]=='O'&&!jud[lenx-1][i])
{
judgle(lenx-1,i,board,jud);
jud[lenx-1][i]=true;
}
}
for(int i=0;i<lenx;i++)
{
for(int j=0;j<leny;j++)
{
if(!jud[i][j])
{
board[i][j]='X';
}
}
}
}
private void judgle(int x, int y, char[][] board, boolean[][] jud) {
// TODO Auto-generated method stub
for(int i=0;i<4;i++)
{
int x1=x+X[i];
int y1=y+Y[i];
if(x1>=0&&x1<board.length&&y1>=0&&y1<board[0].length)
{
if(!jud[x1][y1]&&board[x1][y1]=='O')
{
jud[x1][y1]=true;
judgle(x1, y1, board, jud);
}
}
}
}
}
またね!注意を払った後、Likouパンチンググループに参加することを歓迎します(Likoucsdnに注意してください)。