- 声望
- 648 点
- 西工币
- 7832 枚
- 贡献值
- 5 点
- 好评度
- 2 点
- 最后登录
- 2011-8-13
- 注册时间
- 2008-1-3
- 帖子
- 841
- 精华
- 0
- 积分
- 1182
- 阅读权限
- 200
- UID
- 13745
 
该用户从未签到 - 西工币
- 7832 枚
- 好评度
- 2 点
- 声望
- 648 点
- 注册时间
- 2008-1-3
- 帖子
- 841
- 积分
- 1182
- UID
- 13745
|
初赛试题
(总分150分)
考生须知:
(1)考生必须注明每道试题所用的语言,无声明的以零分计算。
(2)答案复制到一Word文档中,并以考生的姓名及学号命名该文档保存在桌面。
(3)考试中请遵守考试规则。
1.选择题(20分)
有三个白子和三个黑子如下图布置:
○ ○ ○ . ● ● ●
游戏的目的是用最少的步数将上图中白子和黑子的位置进行交换:
● ● ● . ○ ○ ○
游戏的规则是:(1)一次只能移动一个棋子; (2)棋子可以向空格中移动,也可以跳过一个对方的棋子进入空格,但不能向后跳,也不能跳过两个子。
阅读如下程序:
#include<stdio.h>
int number;
void print(int a[]);
void change(int *n,int *m);
int main()
{
int t[7]={1,1,1,0,2,2,2}; /*初始化数组1:白子 2:黑子 0:空格*/
int i,flag;
print(t);
while(t[0]+t[1]+t[2]!=6||t[4]+t[5]+t[6]!=___(1)___) /*判断游戏是否结束
若还没有完成棋子的交换则继续进行循环*/
{
flag=1; /*flag 为棋子移动一步的标记1:尚未移动棋子 0:已经移动棋子*/
for(i=0;flag&&i<5;i++) /*若白子可以向右跳过黑子,则白子向右跳*/
if(t==1&&t[i+1]==2&&t[i+2]==___(2)___)
{change(&t,&t[i+2]); print(t); flag=0;}
for(i=0;flag&&i<5;i++) /*若黑子可以向左跳过白子,则黑子向左跳*/
if(t==0&&t[i+1]==1&&t[i+2]==2)
{change(&t,&t[i+2]); print(t); flag=0;}
for(i=0;flag&&i<6;i++) /*若向右移动白子不会产生阻塞,则白子向右移动*/
if(t==1&&t[i+1]==0&&(___(3)___))
{change(&t,&t[i+1]); print(t);flag=0;}
for(i=0;flag&&i<6;i++) /*若向左移动黑子不会产生阻塞,则黑子向左移动*/
if(t==0&&t[i+1]==2&&(i==5||t[i-1]!=t[i+2]))
{ change(&t,&t[i+1]); print(t);flag=0;}
}
}
void print(int a[])
{
int i;
printf("No. %2d:.............................\n",number++);
printf(" ");
for(i=0;___(4)___;i++)
printf(" | %c",a==1?'*':(a==2?'@':' '));
printf(" |\n .............................\n\n");
}
void change(int *n,int *m)
{
int term;
term=*n; *n=*m; ___(5)___;
}
从下面的选项中选择你认为正确的填入空格{___(1)__}—{___(5)___}内:
A.*m=term B.i==0||t[i-1]!=t[i+2] C.3 D.6 E.0 F. i==0||t[i+1]!=t[i+2]
G.i<=6
H. i==0||t!=t[i+2]
I.i<=5
J.i<=3
K. term=*m
L.term=*n |
|