题解 P1061 【Jam的计数法】

· · 题解

虽然这题有点水,但是逛了一圈题解区,没有令我满意的dfs做法。

个人认为dfs是十分优美的,她的自相似的性质总是如此迷人,所以我们写dfs的时候也要优雅一点才好。

题意不再赘述,下面我们直接分析dfs过程。

void dfs(int pos,int step)
{
    if(pos==0)return;
    if(step==6)return;
    if(a[pos]<t&&a[pos<a[pos+1]-1)
    {
        a[pos]++;
        for(int i=pos+1;i<=w;i++)
        a[i]=a[i-1]+1;
        output();
        dfs(w,step+1);
    }
    else dfs(pos-1,step);
}

我们用数组a[30]表示Jam数,下标从1开始。

递归边界

状态转移

代码:

//code by rainman
#include<bits/stdc++.h>
using namespace std;

int s,t,w,c;
int a[30],cnt;

inline void output()
{
    for(int i=1;i<=w;i++)
    cout<<(char)('a'+a[i]-1);
    cout<<endl;
}

void dfs(int pos,int step)
{
    if(pos==0)return;
    if(step==6)return;
    if(a[pos]<t&&a[pos]<a[pos+1]-1)
    {
        a[pos]++;
        for(int i=pos+1;i<=w;i++)
        a[i]=a[i-1]+1;
        output();
        dfs(w,step+1);
    }
    else dfs(pos-1,step);
}

int main()
{
    cin>>s>>t>>w;
    fflush(stdin);
    while((c=getchar())!=EOF)
    {
        int temp=c-'a'+1;
        if(temp>=1&&temp<=26)a[++cnt]=temp;
    }

    a[w+1]=0x7f;
    dfs(w,1);
    return 0;
}