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 放棋子程序填空的主要内容,如果未能解决你的问题,请参考以下文章