/**
【问题描述】现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m≤n,使矩阵中每行和每列的宝石都没有相同形状。试设计一个算法,计算出对于给定的m和n,有多少种不同的宝石排列方案。
【算法设计】对于给定的m和n,计算出不同的宝石排列方案数。
【输入形式】第1行有2个正整数m和n(0<m≤n<9).
【输出形式】将计算的宝石排列方案输出。
【样例输入】
3 3
【样例输出】
12
【样例说明】
【评分标准】
*/
#include<stdio.h>
#include<stdlib.h>
int num[10][10];
int m,n;
int count=0;
void swap(int *num1,int *num2)
{
int temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int yes(int r,int c,int k)
{
int i;
for(i = 1; i < r; i++)
if(num[i][c] == k) return 0;
return 1;
}
void backtrack(int r,int c)
{
int i, j;
for(i = c; i <= n;i++){
if(yes(r,c,num[r][i])){
swap(&num[r][c],&num[r][i]);
if(c == n){
if(r == m){
count+=1;
}else {backtrack(r+1,2);}
}else {backtrack(r,c+1);}
swap(&num[r][c],&num[r][i]);
}
}
}
int main()
{
int i, j, temp;
scanf("%d %d",&m,&n);
for(i = 1; i <= n; ++i)
for(j = 1; j<=n; ++j)
num[i][j] = j;
for(i = 2; i <= n; ++i)
swap(&num[i][1],&num[i][i]);
if(m == n) m --;
backtrack(2,2);
int sum = 1;
int sum1 = 1;
int x;
for(x = 1; x <= n;x++)
sum *= x;
for(x = 1; x <= n-1; x++)
sum *= x;
for(x = 1;x <= n - m; x++)
sum1 *= x;
printf("%d\n",(sum*count)/sum1);
return 0;
}
拉丁矩阵
最新推荐文章于 2023-07-04 09:52:22 发布