2017-11-28 31 views
0

そしてもう別の問題があります。 CNF式を作成し、3d配列の整数のマップを使用する必要があります。 今私は2dではなく、3d配列の差し込みの違いで、このタスクを使用しようとします。intをint配列に変換する

私はそれを2つの星(**)の列で行いました。 (あなたが*********星を見ることができる)ブロックと

は、日食は

はなぜそれはそれを書くん「[] int型にフロンint型に変換することはできません」と言っていますか? の「列はありません」と表示されます。

私は明確だったと思います。

public static void encode(int sqrtN, int[][] hints, int[][][] map) { 
    int[] vars = new int [sqrtN*sqrtN]; 
    int nVars = sqrtN*sqrtN*sqrtN*sqrtN*sqrtN*sqrtN; 


** //each cell in the columns gets a different value.** 
    for(int i=0; i<sqrtN*sqrtN; i=i+1){ 
     for(int j=0; j<sqrtN*sqrtN; j=j+1) { 
      for(int k=0; k<sqrtN*sqrtN; k=k+1) 
       vars[k] = columns(map)[i][k][j]; 

      SATSolver.addClauses(exactlyOne(vars)); 
     } 
    } 

    *****//each cell in the blocks gets a different value.****** 
    for(int i=0; i<sqrtN*sqrtN; i=i+1){ 
     for(int j=0; j<sqrtN*sqrtN; j=j+1) { 
      for(int k=0; k<sqrtN*sqrtN; k=k+1) 
       vars[k] = blocks(map,sqrtN)[i][k][j]; 

      SATSolver.addClauses(exactlyOne(vars)); 
     } 
    } 
    //hints. 
    int [] hintsSATS = new int[1]; 
    for (int i = 0; i < hints.length; i = i + 1) { 
     hintsSATS[0] = varName(hints[i][0],hints[i][1],hints[i][2]-1,sqrtN*sqrtN); 
     SATSolver.addClause(hintsSATS); 
    } 

} 

//A function to trunsfer to columns. 
public static int[][][] columns (int[][][] matrix) { 
    int[][][] columns = new int[matrix.length][matrix.length][matrix.length]; 
    for(int j=0; j<matrix.length; j= j+1){ 
     for(int i=0; i<matrix.length; i= i+1){ 
      columns[j][i] = matrix[i][j]; 
     } 
    } 
    return columns; 
} 

    ************ //A function to trunsfer to blocks.********** 
public static int[][][] blocks (int[][][] matrix, int sqrtN) { 
    int[][][] blocks = matrix; 
    for (int i = 0; i<matrix.length; i= i+1) { 
     for (int j = 0; j<matrix.length; j= j+1) { 
      blocks[i][j] = j%sqrtN+ i%sqrtN*sqrtN + 1; 
     } 
    } 
    return blocks; 
} 




//The name of the variable. 
public static int varName(int i, int j, int k, int n) { 
    int varName = n*n*i+n*j+k+1; 
    return varName; 
} 
    //functions for the CNF. Excactly one. 

public static int[][] atLeastOne(int[] vars) { 
    int [][] atLeastOne = new int [1][vars.length]; 
    atLeastOne[0] = vars; 
    return atLeastOne; 
} 

public static int[][] atMostOne(int[] vars) { 
    int [][]atMostOne = new int[AmountOfArrays(vars.length)][2]; 
    int k = 0; 
    for(int i= 0;i<vars.length;i= i+1){ 
     for(int j=i+1;j<vars.length;j= j+1){ 
      atMostOne[k][0] = -vars[i]; 
      atMostOne[k][1] = -vars[j]; 
      k=k+1;   
     } 
    } 
    return atMostOne; 
} 

public static int AmountOfArrays(int n){ 
    int counter = 0; 
    for(int i= 0;i<n-1;i= i+1){ 
     for(int j=i+1;j<n;j= j+1){ 
      counter= counter+1;   
     } 
    } 
    return counter; 
} 

public static int[][] exactlyOne(int[] vars) { 
    int [][] exactlyOne = new int [AmountOfArrays(vars.length)+1][vars.length]; 
    int [][]atLeastOne = new int [1][vars.length]; 
    atLeastOne = atLeastOne(vars); 
    exactlyOne[0] = atLeastOne[0]; 
    for(int i=1; i<exactlyOne.length; i= i+1){ 
     int [][]atMostOne = atMostOne(vars); 
     exactlyOne[i] = atMostOne[i-1]; 
    } 
    return exactlyOne; 
} 
+4

コードを少し絞り込むことはできますか? – notyou

+1

ブロックのタイプはint [] [] []です。ブロック[i] [j]は単純にint []型です。おそらく、3次元目には3番目のループが必要です。 –

+0

[mcve]はあなたの質問の鍵です... – AxelH

答えて

1

問題がblocks[i][j] = j%sqrtN+ i%sqrtN*sqrtN + 1; blocks[i][j]が配列を必要とするが、int型を返すj%sqrtN+ i%sqrtN*sqrtN + 1;ここにあります。

0

public static int[][][] blocks (int[][][] matrix, int sqrtN)の方法では、マルチアレイmatrixを正しく使用していません。

matrix -> int[][][] 
matrix[i] -> int[][] 
matrix[i][j] -> int[] 
matric[i][j][k] -> int 

ですから、細胞内int値を設定できるようにする1つの以上の配列次元で反復するループを追加する必要があります。あなたの配列の次元がすべて同じサイズでない場合、私は、matrix[i].lengthを使用

for (int i = 0; i < matrix.length; ++i) { 
    for (int j = 0; j < matrix[i].length; ++j) { 
     for (int k = 0; k < matrix[i][j].length; ++k) { 
      blocks[i][j][k] = ???? 
     } 
    } 
} 

注、これは安全です。

+0

なぜpublic static int [] [] []カラム(int [] [] []マトリックス)関数で機能するのですか?まったく同じ考えです。私が間違っていなければ... – Man

関連する問題