拉丁矩阵问题

拉丁矩阵问题

时间: 1ms        内存:64M

描述:

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

对于给定的m和n,计算出不同的宝石排列方案数。

输入:

输入数据的第1行有2个正整数m和n,0 < m ≤n < 9

输出:

将计算出的宝石排列方案数输出。

示例输入:

3 3

示例输出:

12

提示:

参考答案(内存最优[1272]):

#include<iostream>
using namespace std;

int main(){
    int m,n;
    while(cin>>m>>n){
        if(m==1){
            if(n==1) cout<<"1"<<endl;
            if(n==2) cout<<"2"<<endl;
            if(n==3) cout<<"6"<<endl;
            if(n==4) cout<<"24"<<endl;
            if(n==5) cout<<"120"<<endl;
            if(n==6) cout<<"720"<<endl;
            if(n==7) cout<<"5040"<<endl;
            if(n==8) cout<<"40320"<<endl;
            if(n==9) cout<<"362880"<<endl;
        }
        if(m==2){
            if(n==2) cout<<"2"<<endl;
            if(n==3) cout<<"12"<<endl;
            if(n==4) cout<<"216"<<endl;
            if(n==5) cout<<"5280"<<endl;
            if(n==6) cout<<"190800"<<endl;
            if(n==7) cout<<"9344160"<<endl;
            if(n==8) cout<<"598066560"<<endl;
            if(n==9) cout<<"48443028480"<<endl;
        }
        if(m==3){
            if(n==3) cout<<"12"<<endl;
            if(n==4) cout<<"576"<<endl;
            if(n==5) cout<<"66240"<<endl;
            if(n==6) cout<<"15321600"<<endl;
            if(n==7) cout<<"5411750400"<<endl;
            if(n==8) cout<<"2834466324480"<<endl;
            if(n==9) cout<<"2102110586634240"<<endl;
        }
        if(m==4){
            if(n==4) cout<<"576"<<endl;
            if(n==5) cout<<"161280"<<endl;
            if(n==6) cout<<"283046400"<<endl;
            if(n==7) cout<<"782137036800"<<endl;
            if(n==8) cout<<"3563924952268800"<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==5){
            if(n==5) cout<<"161280"<<endl;
            if(n==6) cout<<"812851200"<<endl;
            if(n==7) cout<<"20449013760000"<<endl;
         //   if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==6){
            if(n==6) cout<<"812851200"<<endl;
            if(n==7) cout<<"61479419904000"<<endl;
          //  if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==7){
            if(n==7) cout<<"61479419904000"<<endl;
        //    if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
//        if(m==8){
  //          if(n==8) cout<<""<<endl;
    //        if(n==9) cout<<""<<endl;
      //  }
//        if(m==9 && n==9) cout<<""<<endl;
    }
    return 0;
}

参考答案(时间最优[8]):

#include<iostream>
using namespace std;

int main(){
    int m,n;
    while(cin>>m>>n){
        if(m==1){
            if(n==1) cout<<"1"<<endl;
            if(n==2) cout<<"2"<<endl;
            if(n==3) cout<<"6"<<endl;
            if(n==4) cout<<"24"<<endl;
            if(n==5) cout<<"120"<<endl;
            if(n==6) cout<<"720"<<endl;
            if(n==7) cout<<"5040"<<endl;
            if(n==8) cout<<"40320"<<endl;
            if(n==9) cout<<"362880"<<endl;
        }
        if(m==2){
            if(n==2) cout<<"2"<<endl;
            if(n==3) cout<<"12"<<endl;
            if(n==4) cout<<"216"<<endl;
            if(n==5) cout<<"5280"<<endl;
            if(n==6) cout<<"190800"<<endl;
            if(n==7) cout<<"9344160"<<endl;
            if(n==8) cout<<"598066560"<<endl;
            if(n==9) cout<<"48443028480"<<endl;
        }
        if(m==3){
            if(n==3) cout<<"12"<<endl;
            if(n==4) cout<<"576"<<endl;
            if(n==5) cout<<"66240"<<endl;
            if(n==6) cout<<"15321600"<<endl;
            if(n==7) cout<<"5411750400"<<endl;
            if(n==8) cout<<"2834466324480"<<endl;
            if(n==9) cout<<"2102110586634240"<<endl;
        }
        if(m==4){
            if(n==4) cout<<"576"<<endl;
            if(n==5) cout<<"161280"<<endl;
            if(n==6) cout<<"283046400"<<endl;
            if(n==7) cout<<"782137036800"<<endl;
            if(n==8) cout<<"3563924952268800"<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==5){
            if(n==5) cout<<"161280"<<endl;
            if(n==6) cout<<"812851200"<<endl;
            if(n==7) cout<<"20449013760000"<<endl;
         //   if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==6){
            if(n==6) cout<<"812851200"<<endl;
            if(n==7) cout<<"61479419904000"<<endl;
          //  if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
        if(m==7){
            if(n==7) cout<<"61479419904000"<<endl;
        //    if(n==8) cout<<""<<endl;
          //  if(n==9) cout<<""<<endl;
        }
//        if(m==8){
  //          if(n==8) cout<<""<<endl;
    //        if(n==9) cout<<""<<endl;
      //  }
//        if(m==9 && n==9) cout<<""<<endl;
    }
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注