回溯拉丁矩陣



現(xiàn)有n種不同形狀的寶石,每種寶石有足夠多顆。欲將這些寶石排列成m行n列的一個(gè)矩陣,m<=n,使矩陣中每一行和每一列的寶石都沒有相同的形狀。試設(shè)計(jì)一個(gè)算法,計(jì)算出對于給定的m和n,有多少種不同的寶石排列方案。

分析:

寶石n種,又是n列,所以可以認(rèn)為保證每一行的寶石都不同(關(guān)鍵),判斷的時(shí)候只判斷列是否相同就行

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

bool OK(int x,int y){//因?yàn)橹耙呀?jīng)保證每一行都是不同的,所以O(shè)K方法只判斷列相不相同就行
    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){//到達(dá)最后一行 
                if(y==n-1){//到達(dá)最后一列 
                    count++;
                    return; 
                }else{
                    traceback(x,y+1);   
                }
            }else{//還沒有到達(dá)最后一行
                if(y==n-1){//到達(dá)某一行的最后一列 
                    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 ,保證每行內(nèi)寶石種類都不會重復(fù) 
        }
    }
    traceback(0,0); 
    printf("%d",count);
    return 0;
} 
運(yùn)行截圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容