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

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

 int N = ;

 bool CheckStoneNum(int x[][])
{
for(int k=; k<; k++)
{
int NumRow = ;
int NumCol = ;
for(int i=; i<; i++)
{
if(x[k][i]) NumRow++;
if(x[i][k]) NumCol++;
}
if(_____________________) return false; // 填空
}
return true;
} int GetRowStoneNum(int x[][], int r)
{
int sum = ;
for(int i=; i<; i++) if(x[r][i]) sum++;
return sum;
} int GetColStoneNum(int x[][], int c)
{
int sum = ;
for(int i=; i<; i++) if(x[i][c]) sum++;
return sum;
} void show(int x[][])
{
for(int i=; i<; i++)
{
for(int j=; j<; j++) printf("%2d", x[i][j]);
printf("\n");
}
printf("\n");
} void f(int x[][], int r, int c); void GoNext(int x[][], int r, int c)
{
if(c<)
_______________________; // 填空
else
f(x, r+, );
} void f(int x[][], int r, int c)
{
if(r==)
{
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>=) // 本列已满
GoNext(x,r,c);
else if(rr>=) // 本行已满
f(x, r+, );
else
{
x[r][c] = ;
GoNext(x,r,c);
x[r][c] = ; if(!(-rr >= -c || -cc >= -r)) // 本行或本列严重缺子,则本格不能空着!
GoNext(x,r,c);
}
} int main(int argc, char* argv[])
{
int x[][] = {
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; f(x, , ); printf("%d\n", N); return ;
}

请分析代码逻辑,并推测划线处的代码。

答案写在 “解答.txt” 文件中

注意:只写划线处应该填的内容,划线前后的内容不要抄写。


  解答

  NumRow!= || NumCol!=
  f(x,r,c+)
  x[r][c]==

  测试代码

 #include <stdio.h>

 int N = ;

 bool CheckStoneNum(int x[][])
{
for(int k=; k<; k++)
{
int NumRow = ;
int NumCol = ;
for(int i=; i<; i++)
{
if(x[k][i]) NumRow++;
if(x[i][k]) NumCol++;
}
if(NumRow!=3 || NumCol!=3) return false; // 填空
}
return true;
} int GetRowStoneNum(int x[][], int r)
{
int sum = ;
for(int i=; i<; i++) if(x[r][i]) sum++;
return sum;
} int GetColStoneNum(int x[][], int c)
{
int sum = ;
for(int i=; i<; i++) if(x[i][c]) sum++;
return sum;
} void show(int x[][])
{
for(int i=; i<; i++)
{
for(int j=; j<; j++) printf("%2d", x[i][j]);
printf("\n");
}
printf("\n");
} void f(int x[][], int r, int c); void GoNext(int x[][], int r, int c)
{
if(c<)
f(x,r,c+1); // 填空
else
f(x, r+, );
} void f(int x[][], int r, int c)
{
if(r==)
{
if(CheckStoneNum(x))
{
N++;
show(x);
}
return;
} if(x[r][c]==1) // 已经放有了棋子
{
GoNext(x,r,c);
return;
} int rr = GetRowStoneNum(x,r);
int cc = GetColStoneNum(x,c); if(cc>=) // 本列已满
GoNext(x,r,c);
else if(rr>=) // 本行已满
f(x, r+, );
else
{
x[r][c] = ;
GoNext(x,r,c);
x[r][c] = ; if(!(-rr >= -c || -cc >= -r)) // 本行或本列严重缺子,则本格不能空着!
GoNext(x,r,c);
}
} int main(int argc, char* argv[])
{
int x[][] = {
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,},
{,,,,,}
}; f(x, , ); printf("%d\n", N); return ;
}

Freecode : www.cnblogs.com/yym2013

蓝桥杯 第三届C/C++预赛真题(7) 放棋子(水题)的更多相关文章

  1. 蓝桥杯 第三届C/C++预赛真题(8) 密码发生器(水题)

    在对银行账户等重要权限设置密码的时候,我们常常遇到这样的烦恼:如果为了好记用生日吧,容易被破解,不安全:如果设置不好记的密码,又担心自己也会忘记:如果写在纸上,担心纸张被别人发现或弄丢了... 这个程 ...

  2. 蓝桥杯 第三届C/C++预赛真题(1) 微生物增值(数学题)

    假设有两种微生物 X 和 Y X出生后每隔3分钟分裂一次(数目加倍),Y出生后每隔2分钟分裂一次(数目加倍). 一个新出生的X,半分钟之后吃掉1个Y,并且,从此开始,每隔1分钟吃1个Y. 现在已知有新 ...

  3. 蓝桥杯 第三届C/C++预赛真题(5) 转方阵(C基本功)

    对一个方阵转置,就是把原来的行号变列号,原来的列号变行号 例如,如下的方阵: 1 2 3 4 5 6 7 8 9 10 11 1213 14 15 16 转置后变为: 1 5 9 13 2 6 10 ...

  4. 蓝桥杯 第三届C/C++预赛真题(10) 取球游戏(博弈)

    今盒子里有n个小球,A.B两人轮流从盒中取球,每个人都可以看到另一个人取了多少个,也可以看到盒中还剩下多少个,并且两人都很聪明,不会做出错误的判断. 我们约定: 每个人从盒子中取出的球的数目必须是:1 ...

  5. 蓝桥杯 第三届C/C++预赛真题(9) 夺冠概率(手工计算概率)

    足球比赛具有一定程度的偶然性,弱队也有战胜强队的可能. 假设有甲.乙.丙.丁四个球队.根据他们过去比赛的成绩,得出每个队与另一个队对阵时取胜的概率表: 甲 乙 丙 丁 甲 - 0.1 0.3 0.5乙 ...

  6. 蓝桥杯 第三届C/C++预赛真题(4) 奇怪的比赛(递归)

    某电视台举办了低碳生活大奖赛.题目的计分规则相当奇怪: 每位选手需要回答10个问题(其编号为1到10),越后面越有难度.答对的,当前分数翻倍:答错了则扣掉与题号相同的分数(选手必须回答问题,不回答按错 ...

  7. 蓝桥杯 第三届C/C++预赛真题(6) 大数乘法(数学题)

    对于32位字长的机器,大约超过20亿,用int类型就无法表示了,我们可以选择int64类型,但无论怎样扩展,固定的整数类型总是有表达的极限!如果对超级大整数进行精确运算呢?一个简单的办法是:仅仅使用现 ...

  8. 蓝桥杯 第三届C/C++预赛真题(3) 比酒量(数学题)

    有一群海盗(不多于20人),在船上比拼酒量.过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了.再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无几,海盗船 ...

  9. 蓝桥杯 第三届C/C++预赛真题(2) 古堡算式(数学题)

    福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式: ABCDE * ? = EDCBA 他对华生说:“ABCDE应该代表不同的数字,问号也代表某个数字!” 华生:“我猜也是!” 于是,两人沉默了好久, ...

随机推荐

  1. PKCS7 的 attached 和 detached 方式的数字签名

    搜遍了整个网络,都没有详细的说明.只在一个页面上有介绍,还模棱两可的,地址是:http://docs.oracle.com/cd/E19398-01/820-1228/gfnmj/index.html ...

  2. Mybatis <where>标签

    <select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHER ...

  3. struts 防止重复提交表单

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC     &qu ...

  4. FIS3项目构建

    概述 FIS3采取了类似CSS语法一样的配置风格,易于理解与上手.FIS3 是面向前端的工程构建工具.解决前端工程中性能优化.资源加载(异步.同步.按需.预加载.依赖管理.合并.内嵌).模块化开发.自 ...

  5. 【PHP】(原创)之表单FORM的formhash校验,以TP3.2示例

    1.目的:每次表单POST提交(ajax的POST也适用)过来数据,都必须校验formhash参数是否和服务器端的一致,不一致说明重复提交或者 跨站攻击提交csrf 2.原理:参照了 KPPW 的fo ...

  6. CSS3实现文字扫光效果

    本篇文章由:http://xinpure.com/css3-text-light-sweep-effect/ CSS3 实现的文字扫光效果,几乎可以和 Flash 相媲美了 效果解析 我们分析一下实现 ...

  7. discuz开发笔记

    http://blog.csdn.net/tiangsu_php/article/details/7665125 http://www.discuz.net/thread-3225192-1-1.ht ...

  8. CentOS添加新网卡network-scripts目录下找不到网卡配置文件

    问题描述: 使用VMware Workstation虚拟机,安装好CentOS7虚拟机后(原本只有一张网卡ifcfg-ens33),重新添加了一个新的网卡. 进入CentOS7系统后,使用ip add ...

  9. SICP 1.23-1.26体会

    1.23 代码修改非常easy, 关键是时间. 电脑上算了一下. 100000000下面全是0. 開始还以为代码写错了. 最后没办法, 用1e10 1e11来计算. 发现比 1e11 1e12快1.2 ...

  10. How to fix Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse---转载

    How to fix Cannot change version of project facet Dynamic Web Module to 3.0 Error in Eclipse 原文:http ...