题目
现有n种不同形状的宝石,每种宝石有足够多颗。欲将这些宝石排列成m行n列的一个矩阵,m<=n,使矩阵中每一行和每一列的宝石都没有相同的形状。
试设计一个算法,计算出对于给定的m和n,有多少种不同的宝石排列方案。
#include <stdio.h>
#include <math.h>
#define m 3
#define n 3
int a[m][n];
int count=0;//方案数
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){
int temp;
for(int i=y; i<n; i++){
temp=a[x][y];a[x][y]=a[x][i];a[x][i]=temp;
if(ok(x,y)){
if(x==m-1){//最后一行
if(y==n-1){//最后一列
count++;//计数
return;
}else{//最后一行,不是最后一列,y++
dfs(x,y+1);
}
}else{
if(y==n-1){//不是最后一行,是最后一列,换一行,x++,y成0了
dfs(x+1,0);
}else{//不是最后一行,也不是最后一列,接着来,y++
dfs(x,y+1);
}
}
}
}
}
int main(){
for (int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
a[i][j] = j+1;//将每一行赋成1~n
}
}
dfs(0,0);
printf("%d\n",count);
return 0;
}