纸牌游戏——小猫钓鱼

本题用到了栈和队列,题目来自于《啊哈!算法》游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。

对于打出纸牌我们可以认为此操作是出队,打出的牌放入桌上为入栈,收回牌放入自己手中为入队操作,收回桌上的牌为出栈操作。

#include<stdio.h>

struct queue{
	int head;
	int tail;
	int data[1000];
};

struct stack{
	int data[10];
	int top;
};

int main()
{
	int n,t,i,book[10];
	struct queue q1,q2;//q1为a,q2为b 
	struct stack s; 
	s.top = 0;
	//每人牌数 
	scanf("%d",&n);
	//小a的牌 
	q1.head = 1;
	q1.tail = 1; 
	for(i = 1;i <= n;i++)
	{
		scanf("%d",&q1.data[q1.tail]);
		q1.tail++;
	}
	//小b的牌	
	q2.head = 1;
	q2.tail = 1;
	for(i = 1;i <= n;i++)
	{
		scanf("%d",&q2.data[q2.tail]);
		q2.tail++;
	}
	//标记哪些牌在桌上
	 for(i =1 ;i <= 9;i++)
	 	book[i] = 0;
	//循环条件 (手中有牌) 
	while(q1.head < q1.tail && q2.head < q2.tail)
	{
		//小a出牌 
		t = q1.data[q1.head];
		//当桌上没有相对应牌时 
		if(book[t] == 0)
		{
			s.top++;
			s.data[s.top] = t;
			q1.head++;
			book[t] = 1;
		}
		//当桌上有相同牌时 
		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--;
			}
			//收回牌面为t的牌 
			book[s.data[s.top]] = 0;
			q1.data[q1.tail] = s.data[s.top];
			q1.tail++;
			s.top--;
		}
		//如果小a手中牌打完即为结束 
		if(q1.head == q1.tail)
			break; 
			
		//小b出牌 
		t = q2.data[q2.head];
		if(book[t] == 0)
		{
			s.top++;
			s.data[s.top] = t;
			q2.head++;
			book[t] = 1;
		} 
		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--;
			}
			book[s.data[s.top]] = 0;
			q2.data[q2.tail] = s.data[s.top];
			q2.tail++;
			s.top--;
		}
	}
	
	if(q2.head == q2.tail)
	{
		printf("小a win\n");
		printf("手中的牌为\n");
		for(i = q1.head;i < q1.tail;i++)
			printf("%d  ",q1.data[i]);
		if(s.top > 0)
		{
			printf("\n桌上的牌是\n");
			for(i = 1;i <= s.top;i++) 
				printf("%d  ",s.data[i]);
		}
		else
			printf("\nNULL\n");
	}
	
	else
	{
		printf("小b win\n");
		printf("手中的牌为\n");
		for(i = q2.head;i < q2.tail;i++)
			printf("%d  ",q2.data[i]);
		if(s.top > 0)
		{
			printf("\n桌上的牌是\n");
			for(i = 1;i <= s.top;i++) 
				printf("%d  ",s.data[i]);
		}
		else
			printf("\nNULL\n");
	}
	return 0;
}

上一篇:数据结构Python版练习题(一)


下一篇:POJ1198 Solitaire