拉丁矩阵问题

来源:互联网 发布:php单例模式代码 编辑:程序博客网 时间:2024/04/30 10:58
#include<iostream>#include<fstream>#include<algorithm>using namespace std;const int MAX = 50;int n, m;int board[MAX][MAX];//考察当前列是否有相同形状的宝石bool ok(int r, int c, int k){    for(int i=1; i<r; i++)    {        if(board[i][c] == k)            return false;    }    return true;}long int num = 0;  //不同的宝石排列方案数//从上到下,从左到右递归搜索,即先行后列void backtrack(int r, int c){    for(int i=c; i<=n; i++)  //列    {        if(ok(r, c, board[r][i]))  //考察当前列是否有相同形状的宝石        {            swap(board[r][c], board[r][i]);            if(c == n)  //如果列考察完毕            {                if(r == m) //如果行考察完毕                {                    num++;                    return;                }                else                    backtrack(r+1, 1); //考察下一行            }            else                backtrack(r, c+1); //考察下一列            swap(board[r][c], board[r][i]);        }       }}int main(){    ifstream fin("拉丁矩阵.txt");    cout << "\n输入正整数m:";    fin >> m;  cout << m << endl;    cout << "输入正整数n:";    fin >> n;  cout << n;    int i, j;    for(i=1; i<=m; i++)        for(j=1; j<=n; j++)            board[i][j] = j;    backtrack(1, 1);    cout << "\n不同的宝石排列方案数为:" << num;    cout << endl << endl;    return 0;}

这里写图片描述

0 0
原创粉丝点击