回溯拉丁矩阵

2017-01-02  本文已影响0人  Super_邓帅


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

分析:

宝石n种,又是n列,所以可以认为保证每一行的宝石都不同(关键),判断的时候只判断列是否相同就行

#include<stdio.h>
#define n 3
#define m 3
int a[m][n];
int count=0;

bool OK(int x,int y){//因为之前已经保证每一行都是不同的,所以OK方法只判断列相不相同就行
    for(int i=0;i<x;i++){
        if(a[x][y]==a[i][y])
            return false;
    } 
    return true;
}

void traceback(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{
                    traceback(x,y+1);   
                }
            }else{//还没有到达最后一行
                if(y==n-1){//到达某一行的最后一列 
                    traceback(x+1,0);
                }else{
                    traceback(x,y+1);
                }
            }
        }
        temp=a[x][y];
        a[x][y]=a[x][i];
        a[x][i]=temp;
    } 
}

int main(){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            a[i][j]=j+1;//每一行都是1 2 3 ... n ,保证每行内宝石种类都不会重复 
        }
    }
    traceback(0,0); 
    printf("%d",count);
    return 0;
} 
运行截图
上一篇下一篇

猜你喜欢

热点阅读