1. 程式人生 > >拉丁矩陣問題

拉丁矩陣問題

#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;

const int MAX = 50;
int n, m;
int board[MAX][MAX];

//考察當前列是否有相同形狀的寶石
bool ok(int r, int c, int k)
{
    for(int i=1; i<r; i++)
    {
        if(board[i][c] == k)
            return false;
    }
    return
true; } long int num = 0; //不同的寶石排列方案數 //從上到下,從左到右遞迴搜尋,即先行後列 void backtrack(int r, int c) { for(int i=c; i<=n; i++) //列 { if(ok(r, c, board[r][i])) //考察當前列是否有相同形狀的寶石 { swap(board[r][c], board[r][i]); if(c == n) //如果列考察完畢 { if(r == m) //如果行考察完畢
{ num++; return; } else backtrack(r+1, 1); //考察下一行 } else backtrack(r, c+1); //考察下一列 swap(board[r][c], board[r][i]); } } } int main() { ifstream fin("拉丁矩陣.txt"
); cout << "\n輸入正整數m:"; fin >> m; cout << m << endl; cout << "輸入正整數n:"; fin >> n; cout << n; int i, j; for(i=1; i<=m; i++) for(j=1; j<=n; j++) board[i][j] = j; backtrack(1, 1); cout << "\n不同的寶石排列方案數為:" << num; cout << endl << endl; return 0; }

這裡寫圖片描述