用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

排列宝石问题

2012-09-20 作者: 神马举报

[c++]代码库

问题描述:
现有n种不同形状的宝石,每种n颗,共n*n颗。同一种形状的n颗宝石分别具有n种不同的颜色c1, c2, ...,cn中的一种颜色。欲将这n*n颗宝石排列成nn列的一个方阵,使方阵中每一行和每一列的宝石都有n种不同形状和n种不同颜色。试设计一个算法,计算出对于给定的n,有多少种不同的宝石排列方案。

Input
每组测试数据为1个正整数n0<n<5

Output
输出宝石排列方案数

Sample Input
1
2

Sample Output
1
0

#include<iostream>
#include<algorithm>
using namespace std;
const int len=10;
int a[len][len];
int b[len][len];
int cc[len][len];
int dd[len][len];
int ee[len][len];
int n,cnt;
void init()
{
    for ( int i=1; i<=n; i++ )
    {
        for ( int j=1; j<=n; j++ )
        {
            a[i][j]=j;
            b[i][j]=j;
            cc[i][j]=0;
        }
    }
}
int ok ( int r,int c,int k,int fla )
{
    if ( fla )
    {
        if ( cc[a[r][c]][b[r][k]] ) return 0;
        for ( int i=1; i<r; i++ )
        {
            if ( b[i][c]==b[r][k] )
                return 0;
        }
    }
    else
    {
        for ( int i=1; i<r; i++ )
        {
            if ( a[i][c]==a[r][k] )
                return 0;
        }
    }
    return 1;
}
void backtrack ( int r,int c )
{
    for ( int i=c; i<=n; i++ )
    {
        if ( ok ( r,c,i,0 ) )
        {
            swap ( a[r][c],a[r][i] );
            for ( int j=c; j<=n; j++ )
            {
                if ( ok ( r,c,j,1 ) )
                {
                    swap ( b[r][c],b[r][j] );
                    cc[a[r][c]][b[r][c]]=1;
                    if ( c==n )
                    {
                        if ( r==n )
                        {
                            cnt++;
                        }
                        else backtrack ( r+1,1 );
                    }
                    else backtrack ( r,c+1 );
                    cc[a[r][c]][b[r][c]]=0;
                    swap ( b[r][c],b[r][j] );
                }
            }
            swap ( a[r][c],a[r][i] );
        }
    }
}
int main()
{
    while ( cin>>n )
    {
        cnt=0;
        init();
        backtrack ( 1,1 );
        cout<<cnt<<endl;
    }
    return 0;
}



网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...