2016-09-20 15 views
-2

英字を含む正方行列には英単語を含めることができます。任意の方法で単語を検索しながら、左から右に水平に、垂直にダウンロードするか、斜め方向に右に移動できます。下方I 6を取得してい長さの行列を見つけて単語を見つける

与えられた行列

a a k 
a s k 
a k k 

で単語「ASK」は入力行列の4回一致した出力が4出力されるので、例えば、4であるべきである。

public class Pattern1 
{ 
public static void main(String[] args) 
{ 
    mat(); 
} 

public static void mat() 
{ 
    int count = 0; 
    Scanner sc1 = new Scanner(System.in); 
    Scanner sc2 = new Scanner(System.in); 

    System.out.println("enter the no of rows"); 
    int r = sc1.nextInt(); 

    System.out.println("Enter the no of cols"); 
    int c = sc1.nextInt(); 

    String m1[][] = new String[r][c]; 

    System.out.println("Enter the elements row wise"); 

    for (int i = 0; i < r; i++) 
    { 
    for (int j = 0; j < c; j++) 
    { 
    m1[i][j] = sc2.nextLine(); 
    } 
    } 

    System.out.println("Matrix is"); 
    for (int i = 0; i < r; i++) 
    { 
    for (int j = 0; j < c; j++) 
    { 
    System.out.print(m1[i][j] + " "); 
    } 
    System.out.println(); 
    } 

    String s = "ask"; 

    int count1 = 0; 
    String s1[] = s.split(""); 

    int hori = 0, verti = 0, digoL = 0, digoR = 0; 

    //horizontal 

    for (int i = 0; i < r; i++) { 
    count1 = 0; 
    for (int j = 0; j < c; j++) 
    { 
    for (int k = 0; k < s1.length; k++) 
    { 
    if (m1[i][j].equals(s1[k])) 
     count1++; 
    } 
    } 
    if (count1 == s1.length) 
    { 
    hori++; 

    } 
    } 

    //vertical 
    int count2 = 0; 
    for (int i = 0; i < r; i++) { 
    count2 = 0; 

    for (int j = 0; j < c; j++) { 
    for (int k = 0; k < s1.length; k++) { 
    if (m1[j][i].equals(s1[k])) 

     count2++; 
    } 
    } 

    if (count2 == s1.length) 
    { 
    verti++; 
    } 
    } 


    //dioganal right 

    int count3 = 0; 

    for (int i = 0; i < r; i++) { 
    count3 = 0; 
    for (int j = 0; j < i; j++) { 
    for (int k = 0; k < s1.length; k++) { 
    if (m1[i][j].equals(s1[k])) 
     count3++; 
    } 
    } 


    if (count3 == s1.length) 
    { 
    digoL++; 
    } 
    } 

    //dioganal left 
    int count4 = 0; 

    for (int i = 0; i < r; i++) { 
    count4 = 0; 
    for (int j = 0; j < i; j++) { 
    for (int k = 0; k < s1.length; k++) { 

    if (m1[i][j].equals(s1[k])) 
     count4++; 
    } 
    } 
    if (count4 == s1.length) { 
    digoR++; 
    } 
    } 
    int sum = verti + hori + digoL + digoR; 
    System.out.println("sum=" + sum); 
} 
} 
+1

との比較を減らすことができるだけにコードを削減してください問題のビット。誰もそれをすべて読んで乾草の針を探す時間がありません –

+1

そのコードをさらにフォーマットします。これは読めません! – fabian

答えて

1

あなたの比較は間違っています。 'Sは、例として水平方向いずれかを分析してみましょう:あなたは、パターン内のすべての要素にそれを比較する行列の各要素について

for (int k = 0; k < s1.length; k++) 
{ 
    if (m1[i][j].equals(s1[k])) 
     count1++; 
    } 
} 

、あなたは第1行について、kに行列インデックスを変更されないのでしている:

  • a == a? a == s? a == k?
  • a == a? a == s? a == k?
  • k == a? k == s? k == k?

0以外の結果が得られる唯一の理由は、一致するものがない場合は、カウンタcount1をリセットすることも忘れてしまったことです。

だから、水平ケースのための修正プログラムは次のようになります。

//horizontal 
for (int i = 0; i < r; i++) { 
    count1 = 0; 
    columnloop: 
    for (int j = 0; j < c; j++) { 
     for (int k = 0; k < s1.length; k++) { 
      if (j + k < m1[i].length && m1[i][j + k].equals(s1[k])) { // raise column index with k 
       count1++; 
      } else { 
       count1 = 0; // reset counter 
       continue columnloop; 
      } 
     } 
     if (count1 == s1.length) { 
      hori++; 
     } 
    } 
} 

内部カウンタはいえ必要とされていないと我々は

int hori = 0, verti = 0, digoUp = 0, digoDown = 0; 

//horizontal 
for (int i = 0; i < r; i++) { 
    columnloop: for (int j = 0; j < c-s1.length+1; j++) { 
     for (int k = 0; k < s1.length; k++) { 
      if (!m1[i][j + k].equals(s1[k])) continue columnloop; 
     } 
     hori++; 
    } 
} 

//vertical 
for (int i = 0; i < c; i++) { 
    rowloop: 
    for (int j = 0; j < r-s1.length+1; j++) { 
     for (int k = 0; k < s1.length; k++) { 
      if (! m1[j+k][i].equals(s1[k])) continue rowloop; 
     } 
     verti++; 
    } 
} 

//diogonal up 
for (int i = s1.length-1; i < r; i++) { 
    columnloop: 
    for (int j = 0; j < c-s1.length+1; j++) { 
     for (int k = 0; k < s1.length; k++) { 
      if (!m1[i-k][j+k].equals(s1[k])) continue columnloop; 
     } 
     digoUp++; 
    } 
} 

//diogonal down 
for (int i = 0; i < r-s1.length+1; i++) { 
    columnloop: 
    for (int j = 0; j < c-s1.length+1; j++) { 
     for (int k = 0; k < s1.length; k++) { 
      if (!m1[i+k][j+k].equals(s1[k])) continue columnloop; 
     } 
     digoDown++; 
    } 
} 

int sum = verti + hori + digoUp + digoDown; 
関連する問題