LQ0228 放棋子程序填空

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0228 放棋子程序填空相关的知识,希望对你有一定的参考价值。

题目来源:蓝桥杯2012初赛 C++ G题

题目描述
本题为代码补全填空题,请将题目中给出的源代码补全,并复制到右侧代码框中,选择对应的编译语言(C/Java)后进行提交。若题目中给出的源代码语言不唯一,则只需选择其一进行补全提交即可。复制后需将源代码中填空部分的下划线删掉,填上你的答案。提交后若未能通过,除考虑填空部分出错外,还需注意是否因在复制后有改动非填空部分产生错误。

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

初始数组中,“1”表示放有棋子,“0”表示空白。

请仔细阅读代码,并填写划线部分缺失的代码。

源代码
C


#include <stdio.h>
#include <stdlib.h>
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(_____________________) 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)
        _______________________;   // 填空
    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(______________)  // 已经放有了棋子  // 填空
    
        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;

问题分析
三处按顺序分别填入“NumCol!=3||NumRow!=3”、“f(x,r,c+1)”和“x[r][c]”

AC的C语言程序如下:


#include <stdio.h>
#include <stdlib.h>
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(NumCol!=3||NumRow!=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;

以上是关于LQ0228 放棋子程序填空的主要内容,如果未能解决你的问题,请参考以下文章

LQ0176 杨辉三角程序填空

LQ0244 开平方程序填空

LQ0234 大数乘法程序填空

LQ0227 反转串程序填空

LQ0196 打印图形程序填空

LQ0193 大衍数列程序填空