苏幕遮。。。 发表于 2013-6-15 00:22:51

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

今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。

苏幕遮。。。 发表于 2013-6-15 00:24:34

注解:蓝桥的初赛题目

苏幕遮。。。 发表于 2013-6-15 18:30:54

有人知道这个算法吗

苏幕遮。。。 发表于 2013-6-15 18:34:49

int N = 0;

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

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

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

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

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

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

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

        if(x)// 已经放有了棋子
        {
                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 = 1;
                GoNext(x,r,c);
                x = 0;
               
                if(!(3-rr >= 6-c || 3-cc >= 6-r))// 本行或本列严重缺子,则本格不能空着!
                        GoNext(x,r,c);
        }
}

int main(int argc, char* argv[])
{
        int x = {
                {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;
}

苏幕遮。。。 发表于 2013-6-15 18:46:40

希望有人能解析一下这个代码
页: [1]
查看完整版本: 今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得: