UVA 127

本文分享了使用GDB进行程序调试的经验,包括如何通过模拟题提升GDB调试能力,详细解析了GDB函数move的实现逻辑,以及如何在实际编程中应用这些技巧。文章深入探讨了GDB调试的基本概念、常用命令及其应用场景,旨在帮助开发者更高效地定位和解决问题。
/*这道题让我gdb调试水平功力大增。。。。好吧,不难的模拟题,不过费了我好长时间.....*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
        int num;     
        char suit;           
}card;
card c[60][60];
int top[60];
int move( int i )
{
    int j, k, s;
    while( top[i] < 0 ) i++; j = i - 1;
    while( top[j] < 0 ) j--; k = j - 1;
    while( top[k] < 0 ) k--; s = k - 1;
    while( top[s] < 0 ) s--;
    if( s >= 0 && i < 52 && (c[i][top[i]].suit == c[s][top[s]].suit || c[i][top[i]].num == c[s][top[s]].num ) )
    {
        top[s]++;
        c[s][top[s]] = c[i][top[i]];
        top[i]--;
        return 1;
    }
    if( j >= 0 && i < 52 && (c[i][top[i]].suit == c[j][top[j]].suit || c[i][top[i]].num == c[j][top[j]].num )  )
    {
        top[j]++;
        c[j][top[j]] = c[i][top[i]];
        top[i]--;
        return 1;
    }
    return 0;
}
int main()
{
    int ans[60], pile;
    char in[3];
    int flag, i;
    while( 1 )
    {
        memset( c, 0, sizeof(c) );
        memset( top, 0, sizeof(top) );
	    for( i = 0; i < 52; i++ )
	    {
		     scanf( "%s", in );
		     if( in[0] == '#' )
		         return 0;
		     switch( in[0] )
		     {
		         case 'A':  c[i][0].num = 1; break; 
		         case 'T':  c[i][0].num = 10;break;
		         case 'J':  c[i][0].num = 11;break;
		         case 'Q':  c[i][0].num = 12;break;
		         case 'K':  c[i][0].num = 13;break;
		         default:   c[i][0].num = in[0] - '0';break;
		     }
            switch( in[1] )
		     {
		         case 'C': c[i][0].suit = 1;break; 
		         case 'D': c[i][0].suit = 2;break;
		         case 'S': c[i][0].suit = 3;break;
		         case 'H': c[i][0].suit = 4;break;
		     } 
	    }
        flag = 1;
        while( flag )
        {
            flag = 0;
            for( i = 1; i < 52; i++ )
            {
                if( move(i) )
                {
                    flag = 1;
                    break;
                }
            }
        }
        memset( ans, 0, sizeof(ans) );pile = 0;
        for( i = 0; i < 52; i++ )
            if( top[i] >= 0 )
            {
                ans[pile] = top[i];
                pile++;
            }
        if( pile == 1 )
            printf( "1 pile remaining:" );
        else
            printf( "%d piles remaining:", pile );
        for( i = 0; i < pile; i++ )
            printf( " %d", ans[i] +1 );
        printf( "\n" );
    }
    return 0;
}
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值