/*这道题让我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;
}
UVA 127
最新推荐文章于 2019-04-29 13:34:38 发布
本文分享了使用GDB进行程序调试的经验,包括如何通过模拟题提升GDB调试能力,详细解析了GDB函数move的实现逻辑,以及如何在实际编程中应用这些技巧。文章深入探讨了GDB调试的基本概念、常用命令及其应用场景,旨在帮助开发者更高效地定位和解决问题。
404

被折叠的 条评论
为什么被折叠?



