本文介紹了Java中N×N矩陣的所有可能排列的處理方法,對大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!
問題描述
我希望使用遞歸生成矩陣的所有可能排列。
例如,2×2矩陣將有24種可能性。
1 2 1 2 1 3 1 4
3 4, 4 3, 2 4, 2 3....24 possibilities.
以下是我的代碼。邏輯看起來很好,但我只能得到四種不同的可能性。我希望有人能幫我解決這件事。
public class NewClass
{
public static int LENGTH=2,count=0;
public static int check_if_array_is_fully_filled(int[][] a)
{
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
if(a[i][j]==0)
{
return 0;
}
}
}
return 1;
}
public static int[][] initialize_all_zeros(int[][] a)
{
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
a[i][j]=0;
}
}
return a;
}
public static void display(int[][] a)
{
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
System.out.print(a[i][j] + " ");
}
System.out.println();
}
System.out.println("********");
count++;
}
public static void generate(int[][] a, int value_to_enter, int done)
{
if(done == 0)
{
for(int i=0;i<a.length;i++)
{
for(int j=0;j<a.length;j++)
{
if(a[i][j] == 0)
{
a[i][j]=value_to_enter;
value_to_enter++;
int v = check_if_array_is_fully_filled(a);
if(v == 1)
{
done = 1;
}
else
{
generate(a,value_to_enter,0);
}
}
}
}
}
if(done == 1)
{
display(a);
}
}
public static void main(String[] agrs)
{
int[][] a;
for(int i=0;i<LENGTH;i++)
{
for(int j=0;j<LENGTH;j++)
{
a = new int[LENGTH][LENGTH];
a = initialize_all_zeros(a);
a[i][j]=1;
generate(a,2,0);
}
}
System.out.println(count);
}
}
推薦答案
我的偽方法是:
-
將矩陣轉(zhuǎn)換為列表
置換列表
對于列表的每個(gè)排列,將列表轉(zhuǎn)換回矩陣。
您沒有提到矩陣中的所有元素是否都是唯一的。如果不是,則還需要從排列中刪除重復(fù)列表(需要在2之后、3之前進(jìn)行篩選。
置換列表:
-
理解這一點(diǎn)的最簡單方法是通過遞歸。
基本步驟是當(dāng)您有兩個(gè)數(shù)字時(shí),排列很容易。它是(a,b)和(b,a)
要添加第三個(gè)元素,您需要將該元素添加到所有位置
例如置換(c,{(a,b),(b,a)})={(c,a,b),(a,c,b),(a,b,c),
(C,b,a),(b,c,a),(b,a,c)}
因此,您的遞歸將是置換的(a,permutedlist)
對于permutedlist中的每個(gè)b,將a添加到列表中的所有可能位置。
這篇關(guān)于Java中N×N矩陣的所有可能排列的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,