拉丁矩陣問題
阿新 • • 發佈:2019-01-24
#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;
}