【Aha】算法篇之扑克游戏(小猫钓鱼)

  • 队列与栈的综合运用
  • 代码详情:两个人打牌,分别依次将牌放到桌子上,若A出的牌与桌子上的牌一样,则A将桌子上两张一样的牌及其中间所有牌放到A手中,看A,B两个人谁先打完所有牌。
  • //队列与栈的综合运用 
    #include<stdio.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;
    	}
        printf("q1手中的牌为:");
    	for(i=1;i<=6;i++){//给q1发6张牌 
    		scanf("%d",&q1.data[q1.tail]);
    		q1.tail++;
    	}
    	printf("\nq2手中的牌为:");
    	for(i=1;i<=6;i++){//给q2发6张牌 
    		scanf("%d",&q2.data[q2.tail]);
    		q2.tail++;
    	}
    
    	while(q1.head<q1.tail&&q2.head<q2.tail)//当俩个队列不为空,执行循环 
    	{
    		t=q1.data[q1.head];//q1出一张牌 
    		//判断桌上是否有这张牌 
    		if(book[t]==0){//桌上没有这张牌 
    			q1.head++;//q1已经打出一张牌,所以要把这张牌出列 
    			s.top++;
    			s.data[s.top]=t;//把打出的那张牌放到桌上,入栈 
    			book[t]=1;//标记桌上已经有了牌面为t的牌 
    		}
    		else{//桌上有这张牌 
    			q1.head++;//q1已经打出一张牌,所以要把这张牌出列 
    			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 
    			}
    			book[s.data[s.top]]=0;
    			q1.data[q1.tail]=s.data[s.top];
    			q1.tail++;
    			s.top--; //收回桌上牌面为t的牌 
    		}
    		if(q1.head==q1.tail)break;//q1如果牌打完,游戏结束 
    		
    		t=q2.data[q2.head];
    		if(book[t]==0){
    			q2.head++;
    			s.top++;
    			s.data[s.top]=t;
    			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("q1WIN\n");
    		printf("q1当前手中的牌为:");
    		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("q2WIN\n");
    		printf("q2当前手中的牌为:");
    		for(i=q2.head;i<=q2.tail-1;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桌上没有牌了");
    		}	
    	}
    	return 0;
    }

猜你喜欢

转载自blog.csdn.net/qq_42735631/article/details/81328996