您的位置:首页 > 其它

拉丁矩阵问题

2016-12-24 17:37 1031 查看
拉丁矩阵问题

    现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m<=n,使矩阵中每一行和每一列的宝石都没有相同的形状。试设计一个算法,计算出对于给定的m和n,有多少种不同的宝石排列方案。

输入:

  3 3

输出:

  12

解:

拉丁矩阵问题:
首先给矩阵进行赋值,每一行赋值都不相同
此时每一行已经不同了,
对每一行进行全排列的过程 中,每一行一定不会出项相同的情况
所以要对每一列进行判断是否存在相同的情况。
如果满足每一列都不相同,则此时的矩阵满足条件,方案数加1.

#include <stdio.h>
int a[100][100];
int m,n;
int count;

bool ok(int x,int y)
{
for(int i=0;i<x;i++)
if(a[i][y]==a[x][y])
return false;
return true;
}

void dfs(int x,int y)
{//判断列中是否存在相同的数。因之前所有都已判断过,所以只需判断是否有与a[x][y]想等数
for(int i=y;i<n;i++)
{
int temp=a[x][y];
a[x][y]=a[x][i];
a[x][i]=temp;
if(ok(x,y)){//没有冲突
if(x==m-1){//最后一行,在判断y是否到达最后
if(y==n-1){
count++;
}
else
dfs(x,y+1);
}
else{//不是最后一行,判断是否是最后一列
if(y==n-1)
dfs(x+1,0);
else
dfs(x,y+1);
}
}
temp=a[x][y];
a[x][y]=a[x][i];
a[x][i]=temp;
}
}

int main()
{
scanf("%d %d",&m,&n);
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=j+1;
}
}

count=0;
dfs(0,0);
printf("%d\n",count);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息