玩汉若塔的ps视频教程程

访问:394615次
积分:8357
积分:8357
排名:第858名
原创:392篇
转载:168篇
译文:45篇
评论:86条
(1)(1)(2)(1)(1)(6)(3)(6)(23)(34)(18)(46)(19)(10)(21)(30)(72)(23)(19)(4)(2)(2)(3)(1)(6)(8)(40)(19)(10)(27)(18)(12)(3)(3)(2)(7)(21)(34)(7)(21)(1)(3)(5)(10)
会研究glog,leveldb,mudo日志库等&汉诺塔II:(hdu1207)
/先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上,
规则小的必需放在大的上面,每次搬一个,求最小步数。这个问题简单,DP:a[n]=a[n-1]+1+a[n-1],先把
上面的n-1个放在B上,把最大的放在目标C上,再把N-1个放回到C上即可。
&/pre&&p&&/p&现在是汉若塔II,改为四个塔,开始方程想简单了,不是最优的。给出网上的一种最优解法如下:(1)将x(1&=x&=n)个盘从a柱依靠b,d柱移到c柱,这个过程需要的步数为F[x];(2)将a柱上剩下的n-x个盘依靠b柱移到d柱(注:此时不能够依靠c柱,因为c柱上的所有盘都比a柱上的盘小)     些时移动方式相当于是一个经典汉诺塔,即这个过程需要的步数为2^(n-x)-1(证明见再议汉诺塔一);(3)将c柱上的x个盘依靠a,b柱移到d柱上,这个过程需要的步数为F[x];第(3)步结束后任务完成。故完成任务所需要的总的步数F[n]=F[x]+2^(n-x)-1+F[x]=2*F[x]+2^(n-x)-1;但这还没有达到要求,题目中要求的是求最少的步数,易知上式,随着x的不同取值,对于同一个n,也会得出不同的F[n]。即实际该问题的答案应该min{2*F[x]+2^(n-x)-1},其中1&=x&=n;在用高级语言实现该算法的过程中,我们可以用循环的方式,遍历x的各个取值,并用一个标记变量min记录x的各个取值中F[n]的最小值。方法很容易理解,但是还有其他摆法(如第一步未必先要把所有X个放到一个非目标底座上),目前无法证&p&明其最优性,证明还需求路过大神指导。&/p&&p&&/p&&pre name=&code& class=&cpp&&#include&iostream&
#include&cmath&
unsigned long long a[65];
const unsigned long long one=1;
int main()
a[1]=1;a[2]=3;
for(int i=3;i&65;i++)
unsigned long long min=(one&&(i-1))-1+2*a[1];
for(int j=2;j&i;j++)
if(2*a[j]+(one&&(i-j))-1&min)
min=2*a[j]+(one&&(i-j))-1;
while(cin&&n)
cout&&a[n]&&
汉若塔III &hdu2064
在经典汉若塔问题的条件改为,每次只能移动到附近塔上,求把A塔所有的移动C塔最小次数。
a[n]=a[n-1]+1+a[n-1]+1+a[n-1]:先把上面的N-1个移动到C(必然有这个状态),在把最大的移到B,再把N-1移到到A,把最大的移到C,再把N-1个移到C,就上面的方程。分分钟搞定~~~
#include&iostream&
#include&cmath&
unsigned long long a[65];
int main()
for(int i=2;i&36;i++)
a[i]=3*a[i-1]+2;
while(cin&&n)
cout&&a[n]&&
汉若塔IV HDU 2077
在汉若塔3的基础上,改条件:
#include&iostream&
#include&cmath&
unsigned long long ac[23];
unsigned long long bc[23];
unsigned long long ans[23];
int main()
ac[1]=2;bc[1]=1;ans[1]=2;ans[2]=4;
for(int i=2;i&22;i++)
ac[i]=3*ac[i-1]+2;
bc[i]=bc[i-1]+1+ac[i-1];
for(int i=3;i&22;i++)
ans[i]=2*bc[i-1]+2;
while(tt--)
cout&&ans[n]&&
汉若塔V HDU1995
在经典汉若塔问题上附加问题:求出N个盘子时,第K号盘子的移动次数。
思路,一想就是二维DP,DP[n][i]=dp[n-1][i]*2(1=&i&n),dp[n][n]=1;
最大盘只移动一次,上面盘子先移到B塔,一次,最后由B到目标C又一次,思路清晰,分分钟KO。
#include&iostream&
#include&cmath&
unsigned long long dp[62][62];
int main()
dp[1][1]=1;dp[2][1]=2;dp[2][2]=1;
for(int i=3;i&61;i++)
for(int j=1;j&i;j++)
dp[i][j]=2*dp[i-1][j];
dp[i][i]=1;
while(t--)
cin&&n&&m;
cout&&dp[n][m]&&
汉若塔VI HDU1996
在经典汉若塔问题上,求一共有多少个状态(包括所有可能移到到的状态),一个排列组合问题,
答案:求和( C(k1,n)*C(k2,n-k1))其中n&=k1&=0,n-k1&=K2&=0,从中挑出K1个从小到大放在A塔,再从剩下的
挑出K2个放在B塔,剩余的放在C塔即可。数据非大数。
其他巧妙方法:每个盘从小到大每个都有3种选择,共3^n。
#include&iostream&
unsigned long long a[32];
long long C(int m,int n)
if(m==0||n==0)return 1;
long long c=1,s=1;
for(i=m;i&=m-n+1;i--)
for(i=n;i&1;i--)
int main()
for(int i=1;i&30;i++)
for(int k1=0;k1&=i;k1++)
for(int k2=0;k2&=i-k1;k2++)
a[i]+=C(i,k1)*C(i-k1,k2);
while(t--)
cout&&a[n]&&
汉诺塔VII hdu1997 在经典汉若塔问题上,给出任意一个状态(移到过程中),判断该状态是否在正确的(最小移到情况)状态
思路:做到这题,汉若塔就很清晰了,有几步、几个状态、状态的正确性、每个盘子的移到情况,都了如指掌。说说该题思路:
n号塔必然是A-&C,那么N-1号塔, 若n在A,则n-1 在A或B,
#include&iostream&
char get[68];
//保存I号盘子在哪个塔
bool over=0; bool tf=1;
//是否结束,true_or_false是否为假
void dfs(char fl,char fr, char cur,int now)
// dfs ,上面一层(now)左边和右边的塔,已经从哪个塔“下来的”(上面一层是哪个塔)
if(now==1){over=1;}
if(fl=='A'&&fr=='B'||fl=='B'&&fr=='A')temp='C';
else if(fl=='A'&&fr=='C'||fl=='C'&&fr=='A')temp='B';
else temp='A';
if(cur==fl)
//若上一层是左边的塔
if(get[now]==fr){over=1;tf=0;}
//不可能是fr
dfs(fl,temp,get[now],now);
else if(cur==fr)
if(get[now]==fl){over=1;tf=0;}
dfs(temp,fr,get[now],now);
int main()
while(T--)
int n,m,p,q,
for(int i=0;i&m;i++)
cin&&get[tx]='A';
for(int i=0;i&p;i++)
cin&&get[tx]='B';
for(int i=0;i&q;i++)
cin&&get[tx]='C';
if(get[n]=='B')
cout&&&false&&&
dfs('A','C',get[n],n);
if(tf==1)cout&&&true&&&
else cout&&&false&&&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:67575次
积分:2513
积分:2513
排名:第6505名
原创:171篇
评论:35条
(1)(9)(1)(1)(8)(13)(34)(24)(4)(6)(11)(21)(24)(14)(1)(3)(1)(2)商户合作QQ:,群
|Copyright ,|备案号:粤ICP备号-2|声明:本站内容都来源于网络,如有侵权,请联系我们!这个话题历来有很大争议, 喜欢C的对C++不屑一顾,喜欢C++的觉得C是一个子集合。
最早接触C语言是高中时候, 那时一帮搞奥数的同学,有人带了一本谭浩强的书,于是大家学得热火朝天。师大附中的3年,是人生最自卑的3年。一个宿舍8个人, 湖南省前6名就有4个被宿舍牛人占了。这3年最大的打击就是自己智商怎么怎么低。有人说搞IT的都智商比较高, 那看和谁比了, 和搞数学的比,就基本全是弱智了。记得那时看了一个月,也没明白赋值是怎么回事。宿舍一哥们, 看了一个星期就搞懂了。一打听, 妈的, 人家中考700分考695的。心理压力那个大啊。
然后就是3年后,99年到了上海, 第一门课就是C++语言。 那时是面向对象的顶峰。我也免不了。凭着自己的小聪明, 一个暑假看完同济大学的高等数学, 然后第一学期的高数免修时间就全部用来学C++。这一入火坑就是6年。回顾这6年, 我现在后悔了。 脱离实际, 被语言细节玩死了。 看了一大堆书, 懂一大堆理论,实际项目到底如何面向对象分析还是一头雾水。 历史如果能够重来, 我情愿学习另一门语言, 英语。回过头来看, 我花了大量时间,看了大量书, 但脱离实际, 基本上是在岸上游。再加上C++语法过于繁杂。
客观上也让学习者找不到北。
其实上, C++最大的问题就是死在搞不懂它的设计哲学。坦率的地说,我学习了6年,工作中又用了4年, 我还是没自信说我懂C++。更主要的是, 我没有搞懂多继承到底怎么用。面向对象里,我最搞不懂的就是继承。继承的最大问题就是破坏封装。这2者的平衡实在是太难掌握了。现在各种面向对象实现版本,继承是最大问题。
首先现实中的继承都是部分继承。 比如,继承父母的财产。你只能继承一部分,不可能继承所有。然后, 是继承父母的性格。但,你会和父母的性格完全一致吗, 显然不可能。
这中间的差别就在于, 虽然能继承A,和B, 但你没有办法让系统自动解决A和B之间的融合, 构建一个新的C。即C很难只继承A类的X函数的部分特性,再继承B类的Y函数的部分特性。如果你直接调用A.X 和B.Y,显然由于A和B是高耦合, 这必然会带来一些副作用。如果要修改这些副作用, 你必然又要影响A和B的封装。矛盾就在于, 作为子类, 你
没有权力修改A和B。 问题的关键就是,现实的继承都有融合和进化。 而目前的面向对象语言基本上很难提供有价值的工具来解决融合和进化。
这样,我们很快就会发现, 系统并没有变得更简单, 反而更复杂了。我们本意是想通过工具来简化系统,却事与愿违,让自己更晕了。
而C为什么没有这个包袱呢? 因为C完全是你自己控制整个融合。只有人才能精确的知道A类哪些属性是自己想要的, 哪些是垃圾数据。只有人才能清楚的知道哪些函数满足isA关系,哪些函数必须丢弃,哪些函数还可以改改用用。
这中间的最大差别是, 你将问题丢给C++, 但事实上它并没有你想的那么强大。而C是完全告诉你,对不起,这个搞不定,必须你自己来。
这样,最终结果就是, 系统虽然对外接口看起来很完美, 里面相互冲突相互矛盾的东西一大堆。你原以为能在下一个系统中完美重用, 却发现一旦抽象的映射关系由于项目的变化,而导致大量的isA关系变成isNotA关系。怎么办? 将上千个类完全重写? 事实上,光自上而下检查所有isA关系就已经让你吐血了。更不用说再在高内聚的类上动刀子解耦。工作这么多年,C++让我最开心的就是,这个库你们负责,我只管调接口。 这的确比C稍微快一点,少敲了一些 void*this, 但如果让我去改某个号称C++高手,其实只是胡乱写了2-3年代码的人,
我只能往上追溯XXX年,(略500字)
当然,上面这个问题不是C++的问题,是所有面向对象语言通用的问题。这些号称无敌的工具, 却完全没有智能, 一旦抽象关系发生变化,它们什么也干不了。而一旦人来维护这些关系的时候, 却发现还不如重写, C+V操作来得快。
我喜欢C的最大原因就是它的哲学: 能干的一定帮你干好, 不能干的你自己必须干好。 &决定一切的不是计算机,而是人。
关于效率问题, C一直被人诟病, 其实你完全可以C + 自己构建的语言来解决。 我去年就自己设计了一个简单的语言, 能快速地将描述性代码转换为面向对象版C语言。
谁说C不能面向对象? 说C不能面向对象的人, 其实是自己还没懂面向对象。 看起来好像学了C++, 懂了,其实完全只是为了方便C+V, 却完全不管父类里面10个函数有8个不满足isA关系。 没事,只要我这个项目只用10个中的2个就可以。后面项目有没有,还在不在这个公司谁知道呢?
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:72510次
积分:1848
积分:1848
排名:第10056名
原创:84篇
评论:56条
文章:11篇
阅读:5220
(1)(1)(4)(5)(11)(9)(4)(7)(5)(1)(7)(6)(24)(4)(6)(5)(1)(4)(2)(9)(1)

我要回帖

更多关于 编发教程视频 的文章

 

随机推荐