传送门

题解:

  相关变量解释:

 int s,t,w;
int tot=;//最多输出五组
int maxNum[maxn];//maxNum[i] : i 位置可以达到的最大值
char letter[maxn];

  深搜步骤:

  (1):预处理出num[ ],maxNum[ ]

 for(int i=;i <= w;++i)
num[i]=letter[i-]-'a'+;//将单词转换成数字
for(int i=w;i >= ;--i)
maxNum[i]=t--;//求出i位置可达到的最大值

  (2):从w开始往前遍历,找到数值可以变大的位置,在通过Dfs( )求出由于当前位置影响而满足条件的Jam数

 int index=w;
while(index >= )//从后往前遍历
{
while(num[index] < maxNum[index])//判断当前位置是否可以变得更大
{
num[index]++;
Dfs(index,index+,num);//求出受当前位置变大的影响的Jam数
}
index--;
}

  (3):Dfs( )

 void Dfs(int start,int curPos,int num[])
{
if(tot == )
return ;
//curPos == w+1 作用 : 特判index == 1的情况
if(curPos == w || curPos == w+)
{
if(curPos == w)//特判
num[w]=num[w-]+;
while(num[w] <= maxNum[w])//判断w位置的数是否可以变大
{
Print(num);//打印答案
tot++;
if(tot == )
return ;
num[w]++;
}
int prePos=w-;//回溯,查找w位置之前,start位置之后第一个变大的位置
while(prePos > start && num[prePos] == maxNum[prePos])
prePos--;
if(prePos > start)//找到
{
num[prePos]++;
Dfs(start,prePos+,num);
}
return ;
}
num[curPos]=num[curPos-]+;
Dfs(start,curPos+,num);
}

AC代码:

 #include<iostream>
#include<cstdio>
using namespace std;
const int maxn=; int s,t,w;
int tot=;//最多输出五组
int maxNum[maxn];//maxNum[i] : i 位置可以达到的最大值
char letter[maxn]; void Print(int num[])
{
for(int i=;i <= w;++i)
printf("%c",num[i]-+'a');
printf("\n");
}
void Dfs(int start,int curPos,int num[])
{
if(tot == )
return ;
if(curPos == w || curPos == w+)
{
if(curPos == w)
num[w]=num[w-]+;
while(num[w] <= maxNum[w])
{
Print(num);
tot++;
if(tot == )
return ;
num[w]++;
}
int prePos=w-;
while(prePos > start && num[prePos] == maxNum[prePos])
prePos--;
if(prePos > start)
{
num[prePos]++;
Dfs(start,prePos+,num);
}
return ;
}
num[curPos]=num[curPos-]+;
Dfs(start,curPos+,num);
}
void Solve()
{
int num[maxn];
for(int i=;i <= w;++i)
num[i]=letter[i-]-'a'+;//将单词转换成数组
for(int i=w;i >= ;--i)
maxNum[i]=t--;//求出i位置可达到的最大值
int index=w;
while(index >= )
{
while(num[index] < maxNum[index])
{
num[index]++;
Dfs(index,index+,num);
}
index--;
}
}
int main()
{
scanf("%d%d%d",&s,&t,&w);
scanf("%s",letter);
Solve();
}

Dfs

大神Dfs()精简代码:

https://rainman.blog.luogu.org/solution-p1061

 #include<bits/stdc++.h>
using namespace std; int s,t,w,c;
int a[],cnt; inline void output()
{
for(int i=;i<=w;i++)
cout<<(char)('a'+a[i]-);
cout<<endl;
} void dfs(int pos,int step)
{
if(pos==)
return;
if(step == )
return;
if(a[pos] < t && a[pos] < a[pos+]-)
{
a[pos]++;
for(int i=pos+;i<=w;i++)
a[i]=a[i-]+;
output();
dfs(w,step+);
}
else
dfs(pos-,step);
} int main()
{
cin>>s>>t>>w;
fflush(stdin);
while((c=getchar())!=EOF)
{
int temp=c-'a'+;
if(temp>=&&temp<=)
a[++cnt]=temp;
}
a[w+]=0x7f;
dfs(w,);
return ;
}

Dfs

洛谷 P1061 Jam的计数法的更多相关文章

  1. 洛谷P1061 Jam的计数法

    题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...

  2. 【题解】洛谷 P1061 Jam的计数法

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; int ...

  3. 【洛谷P1061 Jam的计数法】搜索

    分析 超级暴力,在尾部+1,再判断. AC代码 type arr=array[0..27]of longint; var st:string; a:array[0..27]of longint; s, ...

  4. 1140 Jam的计数法

    1140 Jam的计数法 2006年NOIP全国联赛普及组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descri ...

  5. Codevs 1140 Jam的计数法 2006年NOIP全国联赛普及组

    1140 Jam的计数法 2006年NOIP全国联赛普及组 传送门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description Jam是个喜欢标 ...

  6. 洛谷 P1596 [USACO10OCT]湖计数Lake Counting

    题目链接 https://www.luogu.org/problemnew/show/P1596 题目描述 Due to recent rains, water has pooled in vario ...

  7. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  8. Jam的计数法

    Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数 ...

  9. Codevs 1140 Jam的计数法

    1140 Jam的计数法 题目描述 Description Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个 ...

随机推荐

  1. Hotspot Java虚拟机的类加载器

    从Java虚拟机角度来讲,有两种类加载器.1.启动类加载器.(Bootstrap ClassLoader,C++)2.所有其他类加载器.(Java,java.lang.ClassLoader) 系统提 ...

  2. Centos虚拟环境工具virtualenvwrapper

    下载安装virtualenvwrapper pip3 install virtualenvwrapper !!!!注意安装virtualenvwrapper必须是在本地环境下!!! 设置Linux的用 ...

  3. fiddler软件测试——Fiddler抓取https设置详解(图文)

    强烈推荐(原创亲测)!!!Fiddler抓取https设置详解(图文)转 本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤,特别是fiddler在设置证书的环节遇到的各 ...

  4. POJ 2299 -Ultra-QuickSort-树状数组求逆序数

    POJ 2299Ultra-QuickSort 使用树状数组记录逆序对数. 把数组按照大小顺序插入,getsum(i)就是i前面的比他大的数. #include <cstdio> #inc ...

  5. visual studio 显示引用关系 作者更改项

    visual studio 2017中,每个类或者方法顶部会显示此方法的引用关系或者作者更改项:这个功能极大了提高了我们代码的定位效率:不过有时候却发现每一行代码都有,会增加我们屏幕显示内容,有时候看 ...

  6. thymeleaf中的判断总结

    判断String字符串,添加引号 th:class="${flag=='forum.html'}?'active'" 判断boolean类型,注意不能当成字符串处理,不能添加引号 ...

  7. Windows系统下在Git Bash中把文件内容复制到剪贴板的命令

    众所周知,在OS系统中,复制文件内容到剪贴板(比如复制公钥到剪贴板)的命令是: pbcopy < ~/.ssh/id_rsa.pub 在Win7或者Win10下这条命令就没用了.可以这样: cl ...

  8. Wannafly挑战赛 22

    爆零祭 T1 这题第一反应gcd啊 所以就把每个a[i]对m取模 然后求它们的gcd 即res = gcd(a[1] % m, a[2] % m, ... , a[n] % m) ans = 1 + ...

  9. Android多种方法显示当前日期和时间

    文章选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术.本文探讨Android显示当前日期和时间的方法. ...

  10. 【Linux命令】用户及分用户组

    查看用户 查看所有用户命令: cat /etc/passwd 上面命令输出内容比较杂乱,可以使用如下命令简化输出: #对于 cat /etc/passwd 的替换 cat /etc/passwd|gr ...