算法 拉丁矩阵问题

题目

现有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;    
}    
    原文作者:拉丁方阵问题
    原文地址: https://blog.csdn.net/plain_maple/article/details/53818664
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞