2011-07-21 18 views
0

私は良い/悪いブロックをチェックする必要がある図を示しています。基本的には、各ブロックのサイズと行数と列数の情報があります。行に偶数または奇数のブロックがあるかどうかもわかります。画像に問題があります - 画像が添付されています

2ブロックのクラスタを作成し、結果のブロック(2の組み合わせ)が良いか悪いかを確認する必要があります。 2つのブロックが良好であれば、結果は良好なブロックであり、そうでなければ不良である。

私はそれのアルゴリズムを知る必要があります。

行に奇数のブロックがある場合は、中間ブロックを無視して最後のブロックを考慮しています。

図は円の形ですが、円周上のブロックは無視されます。だから、私は図に示すようにミドルブロックだけを考慮する必要があります。

私は各行を繰り返し、2のグループを作り、結果を見つける必要があります。しかし、行に奇数のブロックがある場合は、中間のブロックを無視し、最後の2つのブロックをコーナーで作成します。

図のように円の中の形が本物です。

私はこの時点で十分な情報を与えていると思います。

注:この例では2つのグループを作成しますが、一般的なケースと同様に、行内に2,3または4ブロックのグループを作成する必要があります。グループ内のいずれかのブロックが不良である場合、グループ全体、3、または4のグループであるかどうかにかかわらず、グループ全体が不良です。ビジュアル基本言語でコードを書き込む必要があります。サイズは、いいえ。写真の行のブロックは実際のデータではありません。これは単なる例です。

私は、それぞれのブロックとその周囲のブロックが正しいかどうかをチェックする解決策をいくつか持っています。しかし、それはこの方法で行うことができます。

次の2つを追加している場合は、1件の不正ブロックは、どちらかの側の両方が

1に3悪いにつながるも悪い意味)に設定します

ここソリューションです構造体のNxN配列{bool inCircle、badBlock、badGroup;}ブロックがサークル内にある場合はinCircleがtrue、ブロックが不良で最初はbadGroupがfalseの場合badBlockはtrueです。

int length=2; 
for (int i=0; i<N;i++) 
    for(int j=0; j<N;j++) 
    if(array[i,j].badBlock){ 
     for(int x=-length;x<=length;x++) 
      if(i+x>=0 and i+x<N and array[i+x,j].inCircle) then array[i+x,j].badGroup=true; 
     for(int y=-length;y<=length;y++) 
      if(j+y>=0 and j+y<N and array[i,j+y].inCircle) then array[i,j+y].badGroup=true; 
} 

また、各ブロックのx座標とy座標も知っています。簡単な再帰が行います

enter image description here

+0

ミドルブロックをスキップするアルゴリズムは必要ですか?または完全な計算が必要ですか?行ごとに何か? –

+0

これに答えるためにもサンプル入力とサンプル出力が必要になります。あなたがこれをしないとあなたの質問が閉鎖される恐れがあり、おそらくこれまでのコードを私に提供するかもしれない。 – hoodaticus

+0

@ yochai-良いブロックと不良ブロックを見つけるためにも計算を行う必要があります。同様に、私が2または3のグループを作る場合、ブロックが悪い場合、グループ全体が悪いです。 – user847323

答えて

0

、擬似コード:

GroupSize = 2; 
bool Calc(row, start, end) 
{ 
    if (end-start <= GroupSize -1) return true; 
    if (end - start < GroupSize*2) //Single group in the middle, but smaller than 2 groups (calculate only the first group size) 
    { 
     bool result = true; 
     for (i = start ; i < GroupSize; i++) 
     { 
     result = result && row[i]; 
     } 
    } 
    else 
    { 
     return Calc(row, start, start + GroupSize) && Calc(row,end-GroupSize,end) && GroupSize(row, start + GroupSize,end-GroupSize); 

    } 
} 

そのような何か。
考え方は、行の両側を再帰的に計算してから、さらに計算するために中間を送信することです。

再帰は最も簡単な方法(誰もがそうでないかもしれません)、再帰をループに変えることができます。

+0

私は各ブロックのX座標とY座標を知っています悪いか良いかのような情報。 Excelシートには、これらの3つの(c、y、b/g)パラメータがあります。 – user847323

+0

何が優れていますか?一列に並んだ情報のグループを計算することについて何か質問しませんでしたか? –

+0

問題の更新された部分を参照してください。解決策を追加しましたが、これは正しくはありませんが、同様のタイプのものです。 – user847323

関連する問題