寶石排列問題

2021-08-02 11:30:44 字數 1317 閱讀 5545

西安交大 軟體53  蔡少斐

題號:5_10

題目敘述:

現有n種不同形狀的寶石,每種n顆,共n*n顆。同一形狀的n顆寶石分別具有n種不同的顏色c1,c2,…,cn中的一種顏色。欲將這n*n顆寶石排列成n行n列的乙個方陣,使方陣中每一行和每一列的寶石都有n種不同的形狀和n種不同顏色。是設計乙個演算法,計算出對於給定的n,有多少種不同的寶石排列方案。

輸入資料:

只有乙個整數n

輸出資料:

乙個整數,代表不同的寶石排列方案。

題目解答:

問題將採用回溯法解決,首先搜尋其所有的解空間,並生成解空間樹,將滿足條件的情況記錄下來。

實現細節:在行進行生成2個排列的時候,先生成形狀的排列,然後對形狀進行列有效判定,若成功則進一步生成行顏色排列,並對顏色進行列有效判定。若都成功,那麼這一顆石子也就確定了,則檢驗該石子是否在以前出現過,若出現過則放置失敗,繼續進行同級搜尋,否則的話,我們就該考慮向下乙個位置的搜尋了。

下乙個位置的確定有3種情況,第一種是如果當前位置為(n,n)那麼不繼續進行搜尋,而是ans++。第二種情況是如果當前位置為(x,n)那麼下乙個搜尋的位置就是(x+1,1)。

另外,在進行列有效判定時,採用了std::set資料結構進行輔助設計,可以加速判定。

**實現:

#include#include#include#includeusingnamespace std;

int used[10][10];

int shapes[10][10];

int colors[10][10];

setcol_c[10];

setcol_s[10];

int n;

int cnt = 0;

int dfs(int x, int y )

else else

}used[shapes[x][y]][colors[x][y]]= 0;

}col_c[y].erase(colors[x][y] );

}swap( colors[x][j],colors[x][y] );

}col_s[y].erase(shapes[x][y] );

}swap( shapes[x][i], shapes[x][y]);

}return(f);}

int main()

dfs( 1, 1 );

cout << "答案:" << cnt<< endl;

return(0);

}

執行結果:

排列寶石問題 回溯演算法

問題描述 現有n種不同形狀的寶石,每種n顆,共n n顆。同一種形狀的n顆寶石分別具有n種不同的顏色c1,c2,cn中的一種顏色。欲將這n n顆寶石排列成n行n列的乙個方陣,使方陣中每一行和每一列的寶石都有n種不同形狀和n種不同顏色。試設計乙個演算法,計算出對於給定的n,有多少種不同的寶石排列方案。輸...

LeetCode 寶石與石頭問題

本質 b中有哪些a中的元素,中各有幾個 給定字串j 代表石頭中寶石的型別,和字串 s代表你擁有的石頭。s 中每個字元代表了一種你擁有的石頭的型別,你想知道你擁有的石頭中有多少是寶石。j 中的字母不重複,j 和 s中的所有字元都是字母。字母區分大小寫,因此 a 和 a 是不同型別的石頭。示例 1 輸入...

排列問題(全排列的遞迴演算法問題)

題目 設計乙個遞迴演算法生成n個元素的全排列。演算法講解 設r 是要進行排列的n個元素,ri r 集合x中元素的全排列記為perm x ri perm x 表示在全排列perm x 的每乙個排列前加上字首得到的排列。r的全排列可歸納定義如下 當n 1時,perm r r 其中r是集合r中唯一的元素 ...