lydsy2523[Ctsc2001]聪明的学生

递归搞状态

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 11111
#include <queue>
#include <vector>
const int INF = 999999;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid (r+l)>>1
const int maxn=120000;
int n,m,num[2222][4];
int p(int x,int y)
{
    int c=y-x;
    if(c<0)
        c+=3;
    return c;
}
int times(int i,int j, int t1,int t2,int t3)
{
    int time=0;
    if(j<=0||i<=0) return 0;
    if(i==j)
        time+=t3;
    else if(i>j)
        time+=times(j,i-j,t2,t3,t1)+p(t1,t3);
    else
        time+=times(i,j-i,t1,t3,t2)+p(t2,t3);
    return time;
}
int main()
{
    int t;
    // freopen("in.txt","r",stdin);
    while(scanf("%d%d",&n,&m),n+m!=-2)
    {
        int t=n%3,a,b;
        if(t==0)
            t+=3;
        if(t==3)
            a=1,b=2;
        else if(t==2)
            a=1,b=3;
        else a=2,b=3;
        int tot=0;
        for(int i=1; i<m; i++)
        {
            if(times(i,m-i,a,b,t)==n)
            {
                num[tot][a]=i;
                num[tot][b]=m-i;
                num[tot++][t]=m;
            }
        }
        printf("%d\n",tot);
        for(int i=0;i<tot;i++)
                printf("%d %d %d\n",num[i][1],num[i][2],num[i][3]);
    }
    return 0;
}


posted @ 2014-08-01 23:06  kewowlo  阅读(436)  评论(0)    收藏  举报