算法设计大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
纸牌游戏—小猫钓鱼
规定:甲和乙手中的牌的牌面只有1~9。
分析:
1.甲有两种操作,分别是出牌和赢牌。
——》出牌就是出队,赢牌就是入队。
2.乙有两种操作,分别是出牌和赢牌。
——》出牌就是出队,赢牌就是入队。
3.桌子可以看做是一个栈。
每打出一张牌放到桌上就相当于入栈。
当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
1.首先创建结构体用来实现队列
#include <stdio.h>
#include<string.h>
#include<stdlib.o>
struct queue
{
int data[1000];
int head;
int tail;
};
说明:
Head用来存储对头,tail用来存储队尾。
数组data用来存储队列中的元素,数组data 的大小预设为1000。
2.再创建一个结构体来实现栈
struct stack
{
int data[10];
int top;
};
说明:top用来存储栈顶,数组data用来存储栈中的元素,大小设置为10,因为只有9个不同的牌面。
3.定义两个队列变量q1,和q2。
q1用来模拟甲手中的牌,q2用来模拟乙手中的牌,定义一个栈变量s用来模拟桌上的牌。
structqueue q1,q1;
struct stack s;
4.初始化队列和栈
//初始化队列q1和q2为空,此时两人手中还没有牌
q1.head = 1;
q1.tail = 1;
q2.head = 1;
q2.tail = 1;
//初始化栈s为空,最开始的时候桌子上也没有牌
5.分两次读入甲乙最初时手中的牌
//先读入6张牌,放到甲手上
for(int i=1;i<=6;i++)
{
scanf(“%d”,&q1.data[q1.tail]);//读入一个数到队尾
q1.tail ++;//队尾往后挪一位
}
//再读入6张牌,放到乙手中
for(int i=1;i<=6;i++)
{
scanf(“%d”,&q2.data[q2.tail]);//读入一个数到队尾
q2.tail ++;//队尾往后挪一位
}
6.甲先出牌
t = q1.data[q1.head];//甲先亮出一张牌
7判断打出的牌和桌上的牌有没有相同
flag = 0;
for(int i=1;i<=top;i++)
{
if(t==s[i])
{
flag = 1;
break;
}
}
8.如果flag的值为0,表示甲没能赢得桌上的牌,将打出的牌留在桌上
if(flag == 0){
//甲此轮没有赢牌
q1.head++;//甲已经打出一张牌,所有要把打出的牌出队
s.top++;
s.data[s.top] = t;//再把打出的牌放到桌上,即入栈
}
9.如果flag的值为1就表明可以赢得桌上的牌,需要将赢得的牌依次放入甲的手中
if(flag ==1)
{
//甲此轮可以赢牌
q1.head++;
q1.data[q1.tail]=t;
q1.tail++;
while(s.data[s.top] !=t)
{
q1.data[q1.tail] = s.data[s.top];
q1.tail++;
s.top--;
}
}
10.甲乙流程一样,判断游戏结束
while(q1.head < q1.tail && q2.head < q2.tail)
11.输出最终谁赢得游戏
if(q2.head == q2.tail)
{
printf(“甲游戏获胜”);
printf(“甲当前手中的牌是:”);
for(inti= q1.head;i<=q1.tail;i++)
printf(“%d”,q1.data[i]);
if(s.top>0)
{
printf(“\n桌上的牌是:”);
for(inti=1;i<=s.top;i++)
printf(“%d”,s.data[i]);
}
else
{
printf(“\n桌上已经没有牌了”);
}
}
优化:定义一个大小为10的数组来记录当前桌上已经有哪些牌面就可以了
int book[10];
将数组book[1]~book[9]初始化为0,因此刚开始桌面上一张牌也没有
for (int i=1;i<=9;i++)
book[i] = 0;
如果桌上增加了一张牌面为2的牌,那就需要将book[2]设置为1,表示牌面为2的牌桌面上已经有了,如果这张牌面为2的牌被拿走后,需要及时将book[2]重新设置问为0,表示桌上已经没有牌面为2的牌了。
t = q1.data[q1.head];
if(book[t] == 0)
{
q1.head++;
s.top++;
s.data[s.top] = t;
book[t] =1;
}
结果
具体相关程序代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct queue
{
int data[1000];
int head;
int tail;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct queue q1, q2; struct stack s;
int book[10];
int i, t;
//初始化队列
q1.head = 1;
q1.tail = 1;
q2.head = 1;
q2.tail = 1;
//初始化栈
s.top = 0;
//初始化用来标记的数组,用来标记哪些牌已经在桌上
for (i = 1; i <= 9; i++)
book[i] = 0;
//依次向队列插入6个数
//甲手中的6张牌
for (i = 1; i <= 6; i++)
{
scanf("%d", &q1.data[q1.tail]);
q1.tail++;
}
//乙手上的6张牌
for (i = 1; i <=6; i++)
{
scanf("%d", &q2.data[q2.tail]);
q2.tail++;
}
while(q1.head < q1.tail && q2.head < q2.tail) //当队列不为空的时候执行循环 {
t = q1.data[q1.head]; //甲出一张牌
//判断甲当前打出的牌是否能赢牌
if(book[t] == 0) //表明桌上没有牌面为t的牌
{
//甲此轮没有赢牌
q1.head++;//甲已经打出一张牌,所以要把打出的牌出队
s.top++;
s.data[s.top] = t;//再把打出的牌放到桌上,即入栈
book[t] = 1;//标记桌上现在已经有牌面为t的牌
}
else
{
//甲此轮可以赢牌
q1.head++; //甲已经打出一张牌,所以要把打出的牌出队
q1.data[q1.tail] = t; //紧接着把打出的牌放到手中牌的末尾q1.tail++;
while(s.data[s.top] != t) //把桌上可以赢的牌依次放到手中牌的末尾
{
book[s.data[s.top]] = 0; //取消标记
q1.data[q1.tail] = s.data[s.top]; //依次放入队尾
q1.tail++;
s.top--;//栈中少了一张牌,所以栈顶要减1
}
}
t = q2.data[q2.head]; //乙出一张牌
//判断乙当前打出的牌是否能赢牌
if(book[t] == 0)
{
q2.head++;//乙已经打出一张牌,所以要把打出的牌出队s.top++;
s.data[s.top] = t;//再把打出的牌放到桌上,即入栈
book[t] = 1;//标记桌上现在已经有牌面为t的牌
}
else
{
q2.head++;
q2.data[q2.tail] = t;
q2.tail++;
while(s.data[s.top] != t)
{
book[s.data[s.top]] = 0;
q2.data[q2.tail] = s.data[s.top]; //依次放入队尾q2.tail++;
s.top--;//栈中少了一张牌,所以栈顶要减1
}
}
}
if(q2.head == q2.tail) /// 对手手中没有牌
{
printf("\n甲游戏获胜 \n");
printf("甲当前手中的牌是: ");
for (i = q1.head; i <= q1.tail-1; i++)
printf("%d ", q1.data[i]);
if(s.top> 0) /// 输出桌上的牌
{
printf("\n桌上的牌是: ");
for (i = 1; i <= s.top; i++)
printf("%d ", s.data[i]);
}
else
printf("\n桌上已经没有牌了!");
}
else
{
printf("\n乙游戏获胜\n");
printf("乙当前手中的牌是: ");
for (i = q2.head; i <= q2.tail; i++)
printf("%d ", q2.data[i]);
if(s.top> 0)
{
printf("\n桌上的牌是: ");
for (i = 1; i <= s.top; i++) printf("%d ", s.data[i]);
}
else
printf("\n桌上已经没有牌了!"); }
getchar();
getchar();
return 0;
}。