C语言培训算法2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
可完成N!。
2014年9月23日星期二
5
“蓝桥杯”C语言培训—算法
5.6174问题。假设你有一个各位数字互不相同的四位数, 把所有的数字从大到小排序后得A,从小到大排序后得到B,然 后用A-B替换原来这个数,并且继续操作。例如,从1234出发, 依次可以得到: 4321-1234=3087,8730-378=8352,8532-2358=6174 可有趣的是,7714-1467=6174即回到了它自己。 输入一个N位数,输出操作序列,直到出现循环(即新得 到的数曾经得到过)。输入保证在循环之前最多只会产生1000 个整数。 输入样例:1234 输出样例: 4321-1234=3087,8730-378=8352,8532-2358=6174
2014年9月23日星期二
14
“蓝桥杯”C语言培训—算法
这里,黑格(x,y)的mat[x][y]为1,白色为0。避免同一个 格子访问多次,用标志vis[x][y]记录格子(x,y)是否被访问过。 这过程序在输入之前,在迷宫的外面加上一圈虚拟的白格子, 见下面的程序:
//所有格子都初始化为白色,包括周围一圈的虚拟格子 memset(mat,0,sizeof(mat)); memmset(vis,0,sizeof(vis));//所有格子都没有访问过 for(i=0;i<n;i++) { scanf("%s",s); for(int j=0;j<n;j++) mat[i+1][j+1]=s[j]-'0'; //把图像往中间移动一点,空出一圈白格子 }
算法分析:字符串有多个周期只需求出最小的一个,可以
从小到大枚举各个周期,一旦符合条件就立即输出。判断一个 周期是否合法方法较多。 如:if(word[j]!=word[j%i])即在字符长度内,j字符与j 字符位置求余最小周期不等,则判断下一个,直到相等。输出
最小周期。
2014年9月23日星期二
3
“蓝桥杯”C语言培训—算法
2014年9月23日星期二
8
“蓝桥杯”C语言培训—算法
算法分析:首先需要把字典读入并保存下来。最容易想到 的方法是: (1)每读入一个单词,就和字典中的所有单词比较,看看是 否可能通过重排得到。 (2)将可以重排的一个单词放在一个数组中。 (3)将这个数组排序后输出。 这种算法是正确的,总显得有些“笨”,下面算法是否更 优一些。 (1)如何判断两个单词是否可以通过重排得到?把各个字母 排序,然后直接比较即可。因此可以在读入时就把每个单词按 照字母排好,就不必每次重排了。 (2)是不是必须把能重排的单词保存下来再排呢?这个没有 必要,只要在读入字典之后把所有单词排序,就可以每遇到一 个满足条件的单词就立刻输出。
序列中第一个车厢的编号,而stack[1]是栈底元素。
2014年9月23日星期二
12
“蓝桥杯”C语言培训—算法
9.黑白图像。输入一个n*n的黑白图像(1表示黑色;0表 示白色),任务是统计其中八连块的个数。如果两个黑格子有 公共边或公共顶点,就说它们属于同一个八连块。如下图所示 的图形有3个八连块。
“蓝桥杯”C语言培训—算法
算法分析:数表提示是按斜线分类。第1条斜线有1个数,第 2条斜线有2个数,第3条斜线有3个数„„第i条i个数。这样, 前i条斜线一共有s(k)=1+2+3+„+k=1/2(k*(k+1))个数。
n在哪条斜线上,只要找到一个最小的正整数k,使得n≤s(k)
那么n就是第k条斜线上的倒数第s(k)-n+1个元素(最后一个元 素是倒数第1个元素,而不是倒数第0个元素)。因此第k条斜线 的倒数第i个元素是i/(k+1-i)。
B
C
2014年9月23日星期二
A
11
“蓝桥杯”C语言培训—算法
算法分析:在中转站中,车厢符合后进先出的的原则,称 为栈。由于只有一端生长,实现栈是只需要一个数组stack和栈 顶指针。在C语言中实现栈的方式是通过数组来完成的。为了方 便起见,使用数组下标均从1开始。例如:target[1]是指目标
2014年9月23日星期二
16
“蓝桥杯”C语言培训—算法
10.数表。如下列数,第一项是1/1,第二项是1/2,第三 项是1/2,第四项是3/1,第五项是2/2,„„。输入n,输出第
n项。
样例输入: 3 14 7 12345 样例输出:2/1 2/4 1/4 59/99
2014年9月23日星期二
17
“蓝桥杯”C语言培训—算法
一、常用算法 ※ 穷举法 ※ 多层循环嵌套 ※ 递归法或递推法 ※ 使用栈操作 ※ 动态规划
※ 贪婪法
※ 大数问题 ※ 仿真问题 ※ 博弈问题 ※ 串与正则表达式
※ 二进制文件操作
※ 组合数学中的计数问题 ※ 图论的典型应用 ※ 关于算法几何
1
※ 深度遍历与广度遍历
※ 回溯的技巧
※ 全局最优解与局部最优解
2014年9月23日星期二
“蓝桥杯”C语言培训—算法
1.把手放在键盘上,稍不注意就会错一位。这样的话,Q 会变成W,J会变成K,等等。输入一个错位敲出的字符串,输 出打字员本来想打出的句子。
样例输入:OS,GOMR YPFSU/
样例输出:IAM FINE TODAY.
算法分析:每输入一个字符,都可输出一个字符。问题在
于,如何进行这样的变换?一种方法是使用if和switch。如果 有if(c==‘w’) putchar(‘Q’)。但很明显,这样做太麻烦。 一个较好的方法是使用常量数组即将键盘能用字符表示的作为 字符常量存于字符常量数组中。
2014年9月23日星期二
2
“蓝桥杯”C语言培训—算法
2.如果一个字符串可以由某个长度为K的字符串重复多次得 到,我们说该串以K为周期。例如:abcabcabcabc以3为周期 (注意:它也可以6和12为周期),输入一个长度不超过80的串, 输出它的最小周期。 样例输入:HOHOHO 样例输出:2
2014年9月23日星期二
6
“蓝桥杯”C语言培训—算法
算法分析:两个问题需要解决:如何得到下一个数?如何 检查这个数是否已经出现过? 第一个问题需要我们把各个数字排序,需要把各个数字提
取出来。可编写一个对数进行排序的函数,其方法可采用冒泡
法把一个数按从小到大或从大到小的顺序排序。 第二个问题是逐个生成各个数,并判断是否曾经生成过。 常见方法是用数组。
2014年9月23日星期二
9
“蓝桥杯”C语言培训—算法
7.卡片游戏。桌上有一叠牌,从第一张牌(即位于顶面的 牌)开始从上往下依次编号为1~n。当至少还剩两张牌时进行 以下操作:把第一张牌扔掉,然后把新的第一张放到整叠牌的 最后。输入n,输出每次扔掉的牌,以及最后剩下的牌。 算法分析:这些牌就象是在排队,每次从排头拿到两个, 其中第二个再次排到尾部。称这种数结构为队列。其特点是先
2014年9月23日星期二
18
3.很多学生在学习量,发现“进位”特别容易出错。你 的任务是计算两个整数在相加时需要多少次进位。你编写的程 序应当可以连续处理多组数据,直到读到两个0(这是输入结 束标记)假设输入的整数都不超过9个数字。 样例输入: 123 456 555 555 123 594 00 样例输出: 0 3 1 算法分析:输入的数位数不超过9位, 用循环分别判断各位是否大于9,若大 说明有进位,则统计一次。可采用下 列语句实现。 for(int i=9;i>=0;i--) c=(a%10+b%10+c)>9 ? 1:0; ans+=c; a/=10;b/=10; 如何实现程序终止,样例提示输入两 个00,怎样用语句控制?
进来先出去,符合生活中的排队。用一个数组来实现queue业
来实现这个队列,再设两个指针front和rear。其中front指向 队首元素的位置;rear队尾元素的后一个元素。
2014年9月23日星期二
10
“蓝桥杯”C语言培训—算法
8.铁轨。某城市有一个火车站,铁轨铺设如下图。有n节车 厢从A方向驶入车站,按进站顺序编号1~n。你的任务是让它们 按照某种特定的顺序进入B方向的铁轨并驶出车站。为了重组车 厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车 站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。 对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移 入B,就不能回到C了。换句话说,在任意时刻,只有两种选择: A→C和C→B。 1,2,3,4,5 5,4,3,2,1 样例输入: 5 1 2 3 4 5 5 5 4 1 2 3 样例输出: YES NO
4
2014年9月23日星期二
“蓝桥杯”C语言培训—算法
4.阶层的精确值。输入不超过1000的正整数N,输出N!的 精确值。 样例输入:30 样例输出:265252859812191058636308480000000 算法分析:用一个足够大的数组f来阶层中每位数字,让f[0]保 存结果的个位, f[1]是十位,f[2]是百位,„„(用逆序表示 能较好解决低位向高位的进位问题),则每次只要模拟手算即
2014年9月23日星期二
15
“蓝桥杯”C语言培训—算法
接下来,只需不断找黑格子,然后调用dfs,从它出发寻找 八连块: int count=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(!vis[i][j]&&mat[i][j]) { count ++;dfs(i,j);} printf("%d\n",count);
2014年9月23日星期二
7
“蓝桥杯”C语言培训—wenku.baidu.com法
6.字母重排。输入一个字典(用*****结尾),然后再输 入若干单词。每输入一个单词W,你都需要在字典中找出所有 可以用W的字母重排后得到的单词,并按照字典序从小到大的 顺序在一行中输出(如果不存在,输出:(),输入单词之间用 空格或空行隔开,且所有输入单词都由不超过6个小字母组成。 注意:字典中的单词不一定按字典序排列。 样例输入:tarp given score refund only tarp work earn course pepper part ****** 样例输出: score refund parp tarp tart :( course
2014年9月23日星期二
13
“蓝桥杯”C语言培训—算法
算法分析:用递归求解,递归访问它所有的相邻黑格 int mat[MAXN][MAXN],vis[MAXN][MAXN]; void dfs(int x,int y) { if(!mat[x][y]||vis[x][y]) return 0; //曾经访问过这个格子,或者当前格子是白色 vis[x][y]=1; //标记(x,y)已访问 dfs(x-1,y-1);dfs(x-1,y);dfs(x-1,y-1); dfs(x-1,y);dfs(x,y+1); dfs(x+1);dfs(x+1,y);dfs(x+1,y+1); //递归访问周围的8个格子 }