拉丁矩阵问题
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;
}
现有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;
}
相关文章推荐
- 拉丁矩阵问题
- 拉丁矩阵问题
- 拉丁矩阵问题
- 拉丁矩阵问题
- 拉丁矩阵问题
- 软件使用问题登记表
- 升级到Delphi 6 - 兼容性问题之二
- 升级到Delphi 6 - 兼容性问题之三(完)
- 升级到Delphi 6 - 兼容性问题(中文全文)
- 软件测试问题汇总表
- 如何分析问题和需求?如何界定问题主次?。。。。
- 软件测试问题登记表
- 迁移到 ASP .NET:需考虑的重要问题
- jsp、servlet关于中文问题再谈
- 将Socket应用程序从Unix向Windows移植中应注意的几点问题
- 目录横穿“(Ttaversal)”问题的解决办法
- JBuilder Editor中光标不能正确定位问题的解决
- XML 中的常见问题
- 绘制位图的问题
- 使用ActiveX控件开发网页常见的问题