鱼C论坛

 找回密码
 立即注册
查看: 3701|回复: 4

今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:

[复制链接]
发表于 2013-6-15 00:22:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-15 00:24:34 | 显示全部楼层
注解:蓝桥的初赛题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:30:54 | 显示全部楼层
有人知道这个算法吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:34:49 | 显示全部楼层
int N = 0;

bool CheckStoneNum(int x[][6])
{
        for(int k=0; k<6; k++)
        {
                int NumRow = 0;
                int NumCol = 0;
                for(int i=0; i<6; i++)
                {
                        if(x[k][i]) NumRow++;
                        if(x[i][k]) NumCol++;
                }
                if(NumRow!=3 || NumCol!=3) return false;  
        }
        return true;
}

int GetRowStoneNum(int x[][6], int r)
{
        int sum = 0;
        for(int i=0; i<6; i++)         if(x[r][i]) sum++;
        return sum;
}

int GetColStoneNum(int x[][6], int c)
{
        int sum = 0;
        for(int i=0; i<6; i++)         if(x[i][c]) sum++;
        return sum;
}

void show(int x[][6])
{
        for(int i=0; i<6; i++)
        {
                for(int j=0; j<6; j++) printf("%2d", x[i][j]);
                printf("\n");
        }
        printf("\n");
}

void f(int x[][6], int r, int c);

void GoNext(int x[][6],  int r,  int c)
{
        if(c<6)
                f(x,r,c+1);   
        else
                f(x, r+1, 0);
}

void f(int x[][6], int r, int c)
{
        if(r==6)
        {
                if(CheckStoneNum(x))
                {
                        N++;
                        show(x);
                }
                return;
        }

        if(x[r][c])  // 已经放有了棋子
        {
                GoNext(x,r,c);
                return;
        }
        
        int rr = GetRowStoneNum(x,r);
        int cc = GetColStoneNum(x,c);

        if(cc>=3)  // 本列已满
                GoNext(x,r,c);  
        else if(rr>=3)  // 本行已满
                f(x, r+1, 0);   
        else
        {
                x[r][c] = 1;
                GoNext(x,r,c);
                x[r][c] = 0;
                
                if(!(3-rr >= 6-c || 3-cc >= 6-r))  // 本行或本列严重缺子,则本格不能空着!
                        GoNext(x,r,c);  
        }
}

int main(int argc, char* argv[])
{
        int x[6][6] = {
                {1,0,0,0,0,0},
                {0,0,1,0,1,0},
                {0,0,1,1,0,1},
                {0,1,0,0,1,0},
                {0,0,0,1,0,0},
                {1,0,1,0,0,1}
        };

        f(x, 0, 0);
        
        printf("%d\n", N);

        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:46:40 | 显示全部楼层
希望有人能解析一下这个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 05:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表