大神的blog 题意 思路都有 http://www.cnblogs.com/devymex/archive/2010/08/26/1808604.html
本人的方法比较搓 模拟做的 而且效率不高 我感觉是这样的 但是时间居然是 0.555 不明白 但是能AC不错了
做题的时候还是不够细心啊 大体的思路是有的 老是错在细节上
下面看代码
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
struct M
{
char s[3];
} str[53];
struct N
{
int cnt;
int record[53];
} v[53]; //每堆的牌数 和是什么牌
int T;//多少堆牌
int re_move3(int n)
{
if(v[n].cnt==0)return 0;
int i,j,flag = 1;
i = v[n-3].record[v[n-3].cnt];
j = v[n].record[v[n].cnt];
if(str[i].s[0]==str[j].s[0]||str[i].s[1]==str[j].s[1])
{
v[n-3].cnt++;
v[n-3].record[v[n-3].cnt] = v[n].record[v[n].cnt];
v[n].cnt--;
}
else flag = 0;
return flag;
}
int re_move1(int n)
{
if(v[n].cnt==0)return 0;
int i,j,flag = 1;
i = v[n-1].record[v[n-1].cnt];
j = v[n].record[v[n].cnt];
if(str[i].s[0]==str[j].s[0]||str[i].s[1]==str[j].s[1])
{
v[n-1].cnt++;
v[n-1].record[v[n-1].cnt] = v[n].record[v[n].cnt];
v[n].cnt--;
}
else flag = 0;
return flag;
}
void Solve()
{
int i,k,x,y,flag;
while(T>=2)
{
for(k = 1; k <= T;k++)
if(v[k].cnt==0)break;
if(k<=T)//遇到空堆后面的往前移
{
for(x = k+1;x <=T;x++)
{
for(y = 1; y<=v[x].cnt;y++)
v[x-1].record[y] = v[x].record[y];
v[x-1].cnt = v[x].cnt;
}
v[T].cnt = 0;
T--;
}
flag = re_move1(2);//先判断左边的第二个是否能移到第一个
if(flag)continue;
else i = 2;
if(flag == 0 &&i == T)break;
flag = re_move1(3);//接着判断左边的第三个是否能移到第二个
if(T>=3&&flag)continue;
else i = 3;
if(flag == 0 &&i == T)break;
if(T >= 4)
for(i = 4; i <= T; i++)//后面堆数大于3堆的时候判断能优先移到左边第三堆
{
flag = re_move3(i);
if(flag)break;
flag = re_move1(i);
if(flag)break;
}
if(flag == 0 &&i > T)break;//在这写成 i == T 的时候调了一早上没调出来
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
int flag = 1;
while(flag)
{
T = 1;
for(int i = 0; i <= 52; i++)
{
v[i].cnt = 0;
for(int j = 0; j <=52; j++)
v[i].record[j] = 0;
}
for(int i = 1; i <= 52&&flag; i++)
{
scanf("%s",str[i].s);
if(str[i].s[0] == '#')
{
flag = 0;
break;
}
v[T].cnt++;//这堆牌数加1
v[T].record[1] = i;//记录是什么牌
Solve();
if(v[T].cnt)T++;
}
if(flag)
{
if(T>2)printf("%d piles remaining:",T-1);
else printf("%d pile remaining:",T-1);
for(int i = 1; i <T; i++)
printf(" %d",v[i].cnt);
printf("\n");
}
}
return 0;
}