自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 有如图所示的七巧板,试设计算法,使用至多4种不同颜色对七巧板进行涂色(每块七巧板一种颜色),要求相邻区域的颜色互补相同,打印输出所有可能的涂色方案。

C++代码:#include <iostream>#include <vector>using namespace std;//邻接矩阵表const int data[7][7] = {{0,1,0,0,1,0,1},{1,0,0,1,0,1,0},{0,0,0,1,0,0,1},{0,1,1,0,0,1,1},{1,0,0,0,0,0,1},{0,1,0,1,0,0,0},{1,0,1,1

2016-04-29 14:58:30 7188

原创 走迷宫问题(深度优先遍历 + 广度优先遍历)

迷宫是许多小方格构成的矩形,在每个小方格中有的是墙(用1表示),有的是路(用0表示)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是在右下角(8,8)。根据给定的迷宫,找出一条从入口到出口的路径。解法一(深度优先遍历,打印所有可行的路径):#include <iostream>using namespace std;int maz

2016-04-29 08:54:26 17761 1

原创 已知若干个城市的地图,求从一个城市到另外一个城市的路径,要求路径中经过的城市最少。

算法设计:图的广度优先搜索类似于树的层次遍历,逐层搜索正好可以尽快找到一个结点与另外一个结点相对而言最直接的路径。所以此问题适应广度优先算法。 例如:下图是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。先要找出一条经过城市最少的一条线路。图的邻接矩阵如下表所示,1表示能走,0表示不能走。 C++代码:#include <iostream>#include <vec

2016-04-28 21:24:46 7882

原创 求一个数列(数列中的每个数不相同)的最长不下降子序列。

例如:整数组成的数列为3,18,7,14,10,12,23,41,16,24。则3,18,23,24就是一个长度为4的不下降序列。同时还有3,7,10,12,16,24或3,7,10,12,23,41都是长度为6的最长不下降序列。 请编写算法求出一个数列的最长不下降序列。分析:若从a(i)开始,此时最长不下降序列应该按下列方法求出: 再a(i+1),a(i+2),…,a(n)中,找出一个起始数据

2016-04-28 09:39:48 1862

原创 例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列。编写算法求一直两序列A和B的最长公共子序列。

分析: v[i][j]存储序列“a0,a1,…,ai-1”, “b0,b1,…,bj-1”的最长公共子序列的长度。 则v[i][j]的计算如下: (1). v[i][j] = 0; (2). v[i][j] = v[i-1][j-1]+1, 如果a[i-1] = b[j-1] (3). v[i][j] = max(v[i-1][j],v[i][j-1]),a[i-1] != b[j-1]C

2016-04-26 14:50:39 2121

原创 资源分配问题

设有资源n(n为整数),分配给m个项目,gi(x)为第i个项目分得资源x(x为整数)所得的利润。求总利润最大的资源分配方案,也就是解下列问题: max z = g1(x1)+g2(x2)+……+gm(xm) x1+x2+……+xm = n, xi为整数,i=1,2,3,……,m 函数gi(x)以数据表的形式给出。 C++代码:#include <iostream>#define N 100

2016-04-25 11:44:16 4429

原创 数塔问题

先贴出运行结果: C++代码:#include <iostream>#define N 50using namespace std;//a[.][.][0]存储原始数据//a[.][.][1]存储存储动态规划过程//a[.][.][2]存储最优化路径int main(){ int a[N][N][3]; cout<<"please input the number

2016-04-23 20:22:02 338

原创 string::npos表示不存在的位置

#include <iostream>#include <string>using namespace std;int main(){ string s = "sfefg"; cout<<(s.find('1') == string::npos); return 0;}

2016-04-20 22:08:15 386

原创 设计一个算法,把一个真分数表示为埃及分数之和的形式。所谓埃及分数是指分子为1的分数。如7、8=1/2+1/3+1/24。

数学模型:将一个真分数F表示为A/B;做B/A的整除运算,商为D,余数为K,它们之间的导出关系如下: B=A*D+k B/A=D+K/A#include <iostream>using namespace std;int main(){ int a,b; int c,d; while (cin>>a>>b) { if (a >=

2016-04-20 21:53:06 8667

原创 数列极差问题

在黑板上写了n个正整数排成的一个数列,进行如下操作:每次擦去其中的两个数a和b,然后在数列中加入一个数a*b+1,如此下去直至黑板上剩下一个数,在所有按这种操作方式最后得到的数中,最大的记为max,最小的记作min,则该数列的极差定义位m=max-min。问题分析:下面通过实例来认识题目中描述的计算过程。对3个具体的数据3,5,7,讨论,可能有一下3种结果: (3*5+1)*7+1 = 113,(

2016-04-19 19:22:36 880

原创 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对所给的n和s,寻找一种方案使得剩下的数字组成的新数最小。

#include <iostream>#include <string>using namespace std;//从字符串v中从下标j开始删除s个字符,删除的字符保存在s_del中void min_num(string &v, int &s,int j,string &s_del){ if ( 0 != s) { //如果j小于0则从第0个字符开始

2016-04-19 16:32:27 17862 2

原创 给定一组数,要求从中找出第k小的元素

分析: 这里通过快速排序算法来解决次问题。记一趟快速排序后,左子集中的元素个数为nleft,则选择问题,可能是一下几种情况之一: 1) nleft等于k-1,则枢纽值即为所求; 2) nleft大于k-1,则继续在左子树中找; 3) nleft小于k-1,则继续在右子集中找下面是C++代码实现:#include <iostream>#include <vector

2016-04-19 11:49:14 2407

原创 求一组数的第二小的数据

算法设计:在用二等分法分解的两个子集中,无论只选取第二小数据或只选取最小的数据,合并处理后都有可能得不到原问题的正确解。但若在两个子集中都选取最小的两个值,那么,原问题中第二小的数据则一定在这4个数中。C++源代码:#include <iostream>#include <vector>using namespace std;//在v中下标[i,j]之间,选出最小的两个数,最小的数保存在min1

2016-04-13 19:09:57 2243 1

原创 大整数相乘

思路:以s1=“999”,s2=”66”为例,见下图。C++代码实现:#include <iostream>#include <vector>#include <string>using namespace std;//vector<int> stoint(const string &s){ vector<int> v; size_t sz = s.size();

2016-04-12 19:20:10 406

原创 求数列的最大子段和的两种方法(包括时间复杂度为线性时间的算法)

方法一: C++代码:#include <iostream>#include <vector>using namespace std;const int N = 17;int max_sub_sum(const vector<int> &v, int &best_i, int &best_j){ int n = v.size(); //当前最大子段和 int sum

2016-04-12 16:36:25 3609

原创 金块问题

老板有一袋金块(共n块,n是2的幂(n>=2)),最优秀的雇员得到其中最重要的一块,最差的雇员得到其中最轻的一块。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。C++代码:#include <iostream>#include <vector>#include <ctime>using namespace std;void max_min(vector<int> v,i

2016-04-12 10:42:03 4109

原创 分而治之算法

适合分治法策略的问题 (1) 能将n个数据分成k个不同的子集合,且得到的k个子集合是可以独立求解的子问题,其中1Divide_Conquer(n){ if (n<=n0) { 解子问题; return(子问题的解); } for (i=1;i<k;++i) { 分解原问题为更小的子问题

2016-04-12 09:53:11 440

原创 求两个数的最大公约数和最小公倍数的一种超级简单的方法

数学建模:辗转相除法 不妨设两个整数a>b且a除以b商x余c;则a-bx=c,不难看出a,b的最大公约数也是c的约数(因为一个数能除等式左边就一定能除等式的右边),则a,b的最大公约数与b,c的最大公约数相同。最大公约数的C++代码:#include <iostream>using namespace std;int main(){ unsigned a,b,c; while

2016-04-08 11:39:32 1475

原创 楼梯上有n阶台阶,上楼时可以一步上1阶,也可以一步上两阶,编写算法计算共有多少种不同的上楼梯的方法。

数学模型:此问题如果按照习惯,从前向后思考,也就是从第一阶开始,考虑怎么样到第二阶、第三节、第四阶……则很难找到问题的规律;而反过来先思考“到第n阶有哪几种情况”,答案就简单了,只有两种情况; (1) 从第n-1阶到第n阶 (2) 从第n-2阶到第n阶此问题为斐波那契数列的应用。#include <iostream>using namespace std;int fun(int n){

2016-04-08 10:45:06 34808 3

原创 编写算法对输入的一个整数,判断它能否被3,5,7整除,并输出一下信息之一:

能同时被3,5,7整除; 能被其中两个数(要指出哪两个数)整除; 能被其中一个数(要指出哪一个数)整除; 不能被3,5,7任一个整除。#include <iostream>using namespace std;int main(){ int tmp; cout<<"please enter a number:"; while(cin>>tmp) {

2016-04-07 19:06:31 42261 4

原创 有10箱产品,每箱有1000件,其中正品每件100克。其中有几箱是次品,每件次品比正品轻10克,问能否用秤只称一次,就找出哪几箱是次品?

#include <iostream>#include <vector>//#include <string>using namespace std;int main(){ int n; cout<<"input the number of boxes:"; cin>>n; //标准总重量 long w1 = 0; long w2 = 0;

2016-04-07 18:36:03 4383

原创 填写运算符

输入任意5个数x1,x2,x3,x4,x4两个相邻数之间天上一个运算符。在填入4个运算符“+、-、*、/”后,使得表达式值为一个指定值y(y由键盘输入)。求出所有满足条件的表达式。问题分析:在每两个相邻数之间尝试所有的运算符。#include <iostream>#include <vector>using namespace std;int main(){ string s =

2016-04-07 16:04:05 557

原创 3位老师对某次数学竞赛进行了预测。他们的预测如下。

甲说:学生A得第一名,学生B得第三名。 乙说:学生C得第一名,学生D得第四名。 丙说:学生D得第二名,学生A得第三名。 竞赛结果表明,他们都说对了一半,并且无并列名次,试编程输出a,b,c,d各自得名次。 分析:这题和上一题差不多,只不过上一题只需要一个参数(小偷的编号),而这一题需要4个参数(一、二、三、四名)。需要注意的是在判断语句中“加号”的优先级是高于“==”,所以下面的判断条件要加

2016-04-07 10:00:44 4400

原创 警察局抓了a,b,c,d 4名偷窃嫌疑犯,其中只有一人是小偷。审问中,a说:“我不是小偷。”b说:“c是小偷。”c说:“小偷肯定是d。”d说:“c在冤枉人。”

现在已知4个人中有3个人说的是真话,一个人说的是假话,问到底谁是小偷?问题分析:用枚举尝试法来解决。 算法设计:用变量x存放小偷的编号。 四个人所说的话就可以表示成如下四句话: a说的话: x != 1 b说的话: x == 3 c说的话: x == 4 d说的话: x != 4#include <iostream>#include <vector>using namespace s

2016-04-06 15:30:04 21629 1

原创 求任意三个数的最小公倍数

#include <iostream>#include <vector>using namespace std;int maxNum(int x, int y, int z){ if (x>y && x>z) return x; else if(y>x && y>z) return y; else return z;}

2016-04-06 15:09:35 2129

原创 有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红……

请编写意程序:将各花盆按红、黄、蓝、红、黄、蓝……的顺序排列,而且要求花盆之间的交换次数最少。分析:交换两个变量A、B的值徐需要交换3次,交换3个变量的值需要交换4次。实现要点:实现中并不用专门统计交换次数,而是将3n个数据存储在n*3的二维数组空间中,这样第一列应放红花盆、第二列应该放黄花盆、第三列应该放蓝花盆。程序由直接交换(一次直接交换需要交换3次)和循环交换(一次循环交换需要交换4次)两部分

2016-04-06 10:34:08 1409

原创 螺旋阵:任意给定n值,按如下旋转的方式输出方阵。

n=3 输出: 1 2 3 8 9 4 7 6 5n=4 输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 //思路,i代表外层循环,j表示i层内每边中行或列的下标#include <iostream>#include <string>#define N 100using namespace std;int m

2016-04-05 21:10:23 3425

原创 游戏问题

12个小朋友手拉手站成一个圆圈,从某一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报“1”。这样继续下去,直到最后只剩下一个小朋友。求解这个小朋友站在什么位置上。#include <iostream>using namespace std;int main(){ int state[12]; for (int i=0;i<12;++i) {

2016-04-01 18:49:02 686

原创 高精度整数相加减

include include using namespace std; string _sub(string s1, string s2);inline int compareData(const string &s1,const string &s2) { if (s1.length()>s2.length()) return 1; else if(s1.length()

2016-04-01 16:18:23 745

原创 两种解法:找出n个自然数(1,2,3,……,n)中取r个数的组合。

例如,当n=5,r=3时,所有组合为: 1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5解法1:这种算法的时间复杂度为O(n^r),且r的大小已知,这样才能确定循环的层数。这种算法对于r比较小的时候可以考虑一下。int main(){ int n = 5; int r = 3; for

2016-04-01 09:17:20 10889

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除