2017-01-02 7 views
0

私は2つの点が水平、垂直、または対角線であるかどうかを調べるために、ポイントのセット(queenx、インデックス番号を持つqueeny)その他。次のコードは次のとおりです。座標が与えられている水平、垂直、対角のペアを確認する

checkSlopeメソッドは単純に傾きを計算します。次の点を考慮して、この方法で何が問題なのか分かりません:[0、0] [6,1] [4,2] [7,3] [1,4] [3,5] [5、 6] [2,7]、実際には一致しないことが示されている。

for(int i = 0; i < 8; i++) { 
     int x1 = queenx.get(i); 
     int y1 = queeny.get(i); 

     for(int j = 0; j < 8; j++) { 
      int x2 = queenx.get(j); 
      int y2 = queeny.get(j); 

      if(i != j) { 
       double slope = Math.abs(checkSlope(x1, y1, x2, y2)); 
       try { 
        if ((slope == 1) || (slope == 0)) { 
         correct = false; 
         System.out.println("x1 = " + x1 + " y1 = " + y1 + " x2 = " + x2 + " y2 = " + y2); 
         break; 
        } 
       } catch(Exception e) { 
        correct = false; 
        break; 
       } 
      } 
     } 
    } 

    public static double checkSlope(int x1, int y1, int x2, int y2) { 
     return (double)((y2 - y1)/(x2 - x1)); 
    } 
+1

checkSlopeと "Slope"を定義する方法について説明してください。 –

+0

'checkSlope'関数を表示してください。 'slope == 1'と' slope == 0'はどういう意味ですか?どのようなケースが「正しい」ですか? –

+0

@ModusTollensコードに関数を追加しました –

答えて

1

問題はあなたが遅すぎるために変換中です。部門は整数を使用しています。外側の括弧を削除してみてください:(double)(y2 - y1)/(x2 - x1);

しかし、それは難しい方法です。また、浮動小数点計算は、あなたが学んだように難しいです。例えば。分母がゼロの場合、勾配計算は失敗します。

簡単な方法:同一の水平線上に

  • y1 == y2
  • 同一の鉛直線上に:y2 - y1 == x2 - x1
  • x1 == x2
  • 対角線同じ正の傾きに4つのケースがあります同じ負の傾き対角線上:y2 - y1 == x1 - x2

これらの4つのケースをテストするだけです。あなたは因数分解の違いによってきちんとしたものを作ることができます:あなたが好きなら

int dy = y2 = y1; 
int dx = x2 - x1; 
if (dx == 0 || dy == 0 || dx == dy || dx == -dy) { 
    // match! 
} 

は、あなたが1との最後の2「または」例を置き換えることができます:abs(dx) == abs(dy)を。

+0

現在の方法はどうすれば修正できますか? –

+0

新たに追加されましたが、分母がゼロの場合でも失敗することに注意してください。スロープは間違ったツールです。それはいいです。プログラミングはしばしば最良のものを見つける前に異なるアプローチを試すことを必要とする。 – Gene

+0

これはまだ8クイーンズの問題に間違った答えを得ます... –

関連する問題