mian算法
‘壹’ 数独算法
给你数独计算器:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=143
数独游戏:
http://blog.xunlei.com/web/category.html?uin=mianmiany1978&category_id=174
数独算法:
http://www.puzzle8.com/suku/news.asp
数独快速入门(上篇)
数独快速入门(中篇)
数独快速入门(下篇)
唯一解法
唯一候选数法
隐性三链数删减法
隐性数对删减法
三链列删减法
区块删减法
矩形顶点删减法
关键数删减法
补充:
合格的数独是只有唯一解。
而数独有难易度的分类,找一份报纸注意刊登的数独谜题是1星,还是5星。
在网络上,更分成容易题、进阶题、难题、极难题、超难题....
一般都是依据需要运用的技巧,而技巧是区分难易的。
数独不用猜测,解题全部是运用逻辑推理。
数独不用电脑程序分析,就可以解的题目是直观法数独题。
而超难题是需要电脑分析,及把全盘标示可选数,那是可选数谜题。
没有所谓解题通则。
1.直观解(一般报纸、书籍)
直观法技巧
直观法技巧 01 (容易级) 唯一解
直观法技巧 02 (容易级) 基本摒除
直观法技巧 03 (进阶级) 宫对行列摒除
直观法技巧 04 (进阶级) 行列对宫摒除
直观法技巧 05 (进阶级) 群组解法
直观法技巧 06 (困难级) X-Wing摒除法01
直观法技巧 06 (困难级) X-Wing摒除法02
直观法技巧 07 (困难级) 数偶摒除法
http://hi..com/kiwy07/blog/item/181fc482a153f3bd6c8119ab.html
2.可选数(以程序自动生成可选数)
Last value in block, row or column
Hidden Single in block
Hidden Single in row or column
Direct Pointing
Direct Claiming
Direct Hidden Pair
Naked Single
Direct Hidden Triplet
Pointing
Claiming
Naked Pair, X-Wing, Hidden Pair
Naked Triplet, Swordfish, Hidden Triplet
XY-Wing, XYZ-Wing
Unique rectangles and loops
Naked Quad, Jellyfish, Hidden Quad
Bivalue Universal Graves
Aligned Pair Exclusion
Bidirectioal X-Cycles and Y-Cycles
Forcing X-Chains
Forcing Chains, Bidirectional Cycles
Nishio
Cell/Region Forcing Chains
Dynamic Forcing Chains
http://diuf.unifr.ch/people/juillera/Sudoku/FAQ.html
通则无法解的题
直观难题
006589307
030602008
809703500
000891403
394265871
180374000
003026785
000458030
008037200
可选数极难题
970000000
003927000
008410709
300700400
060050070
007040003
105074900
000068507
786000042
不要把谜题解一次列出,而是找出下一步,及他的逻辑推理方法。
不要用猜测。
‘贰’ c语言 每个糖果1元,三张糖果纸换一个糖果,问N元最多能买几个糖果
一、算法设计:
1、首先N元可以买N个糖果,同时产生N个糖纸;
2、然后每三张糖纸可以换一个糖果,同时产生一张新的糖纸;
3、以此循环下去,直到糖纸数不足3张时(不考虑可以借糖果),结束程序。
二、参考代码:
#include<stdio.h>
intmain()
{
intN,tg,tz;
scanf("%d",&N);//输入N值。
tg=tz=N;//初始糖果和糖纸数都是N个。
while(tz>=3)//糖纸数超过三张,还可以继续换糖果,执行循环。
{
intt=tz/3;//t用来存储当前糖纸可以换的糖果数。
tg+=t;//累加到糖果总数上。
tz=tz%3+t;//剩余的糖纸数。
}
printf("%d元共可买%d个糖果 ",N,tg);//输出结果。
return0;
}
‘叁’ 递归算法怎么理解
问题一:递归算法还不是很理解!!高手教一教! 递归(recursion)是指把一个大的问题转化为同样形式但小一些的问题加以解决的方法。C语言允许一个函数调用它本身,这就是递归调用。即在调用一个函数的过程中又直接或间接地调用函数本身。不加控制的递归都是无终止的自身调用,程序中是绝对不应该出现这种情况的。为了防止无休止的递归,程序中应控制递归的次数,在某条件成立时进行递归,条件不成立不进行递归调用。并且在递归的调用过程中,不断改变递归的条件,以使递归条件不再成立。
同一问题可能既可以用递归算法解决,也可以用非递归算法解决,递归往往算法设计简单,出奇制胜,而普通算法(通常用循环解决)往往设计稍复杂。但执行效率递归算法逊于循环算法。递归反复调用自己,需要占用较多内存和计算机时间。但有一些问题只有用递归方法才能解决,如着名的汉诺塔问题。
递归程序设计的关键就是考虑问题的两种情况,一种是普遍情况即函数值等于把问题递推一步后的本函数的调用,一种是极端或端点情况,此时函数值有确定的一个值而无须再调用本函数。递归的过程就是从普遍情况逐步过渡到端点情况的过程。
例子:
5个坐在一起论年龄,问第五个人多少岁?他说比第四个人大两岁。问第四个人多少岁,他说比第三个人大两岁。问第三个人多少岁,他说比第二个人大两岁。问第二个人多少岁,他说比第一个人大两岁。问第一个人多少岁,他说10岁。请问第五个人几岁?
int age(int n)
{ int x;
if(n>1) x=age(n-1)+2;
else if(n==1) x=10;
return x;
}
void main( )
{ printf(%d,age(5));}
问题二:什么是递归算法 递归算法就是一个函数通过不断对自己的调用而求得最终结果滚咐的一种思维巧妙但是开销很大的算法。
比如:
汉诺塔的递归算法:
void move(char x,char y){
printf(%c-->%c\n,x,y);
}
void hanoi(int n,char one,char two,char three){
/*将n个盘从one座借助two座,移到three座*/
if(n==1) move(one,three);
else{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main(){
int n;
printf(input the number of diskes:);
scanf(%d,&n);
printf(The step to moving %3d diskes:\n,n);
hanoi(n,'A','B','C');
}
我说下递归的理解方法
首先:对于递归这一类函数,你不要纠结于他是干什么的,只要知道他的一个模糊功能是什么就行,等于把他想象成一个能实现某项功能的黑盒子,而不去管它的内部操作先,好,我们来看下汉诺塔是怎么样解决的
首先按我上面说的斗备肆把递归函数想象成某个功能的黑盒子,void hanoi(int n,char one,char two,char three); 这个递归函数的功能是:能将n个由小到大放置的小长方形从one 位置,经过two位置 移动到three位置。那么你的主程序要解决的空轿问题是要将m个的汉诺块由A借助B移动到C,根据我们上面说的汉诺塔的功能,我相信傻子也知道在主函数中写道:hanoi(m,A,B,C)就能实现将m个块由A借助B码放到C,对吧?所以,mian函数里面有hanoi(m,'A','C','B');这个调用。
接下来我们看看要实现hannoi的这个功能,hannoi函数应该干些什么?
在hannoi函数里有这么三行
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
同样以黑盒子的思想看待他,要想把n个块由A经过B搬到C去,是不是可以分为上面三步呢?
这三部是:第一步将除了最后最长的那一块以外的n-1块由one位置经由three搬到two 也就是从A由C搬到B 然后把最下面最长那一块用move函数把他从A直接搬到C 完事后 第三步再次将刚刚的n-1块借助hanno处函数的功能从B由A搬回到C 这样的三步实习了n块由A经过B到C这样一个功能,同样你不用纠结于hanoi函数到底如何实现这个功能的,只要知道他有这么一个神奇的功能就行
最后:递归都有收尾的时候对吧,收尾就是当只有一块的时候汉诺塔怎么个玩法呢?很简单吧,直接把那一块有Amove到C我们就完成了,所以hanoni这个函数最后还要加上 if(n==1)move(one,three);(当只有一块时,直接有Amove到C位置就行)这么一个条件就能实现hanoin函数n>=1时......>>
问题三:怎么更好地终极理解递归算法 递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
需注意的是,规模大转化为规模小是核心思想,但递归并非是只做这步转化,而是把规模大的问题分解为规模小的子问题和可以在子问题解决的基础上剩余的可以自行解决的部分。而后者就是归的精髓所在,是在实际解决问题的过程。
问题四:怎样才能深刻理解递归和回溯? 递归的精华就在于大问题的分解,要学会宏观的去看问题,如果这个大问题可分解为若干个性质相同的规模更小的问题,那么我们只要不断地去做分解,当这些小问题分解到我们能够轻易解决的时候,大问题也就能迎刃而解了。如果你能独立写完递归创建二叉树,前序、中序、后序递归遍历以及递归计算二叉树的最大深度,递归就基本能掌握了。
回溯本人用得很少,仅限于八皇后问题,所以帮不上啥了。
问题五:二叉树的递归算法到底该怎么理解 这不就是在二叉排序树上的递归查找,看程序
tree& find(const T& d, tree& t){
if(t==NULL) return t;如果二叉树为空则返回空,查找失败
if(t->data==d) return t;否则,如果当前根结点关键码为d,则查找成功,当前根结点为待查找结点
if(d>t->data) return find(d, t->right);如果比根的关键码大就递归查找右子树
return find(d, t->left);如果比根的关键码小就递归查找左子树
}
二叉树的递归定义的含义就是非空二叉树,除了根以外,左右子树都是二叉树(可以为空)
问题六:怎么理解递归算法?我看了代码但还是不理解? 函数自己调用自己就是递归啊。
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事。讲的内容是:
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事,讲
从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事……
跟循环差不多。而且浪费栈空间,效率不高。能够转化为循环最好。
问题七:数据结构中的二叉树中的递归怎么理解? 以中序遍历为例,思想是:
若二叉树为空,则空操作;否则
(1)中序遍历左子树
(中序遍历左子树时也是这三步)
(2)访问根结点
(3)中序遍历右子树
(当然右子树也是重复着三步)
示例代码:
int InOrderTraverse(BiTree T)
{
if(T)
{
InOrderTraverse(T->lchild);
printf(%d\t,T->data);
InOrderTraverse(T->rchild);
}
return OK;
}
问题八:java递归算法,怎么理解??? n! = (n-1)*n!
简单理解,就是目前的所有任务,等于前面所有的任务+现在的任务。
比如你求 1。。。100的加法总和
实际上是 1... 99 的加法总和 + 100 就是了。
这就是递归的来源。
你只需要计算你前一步的任务,然后加上自己,就OK了。
前一步,在再次调用前前一步......
问题九:新手一个,有什么更好理解递归的方法吗?(c++) 递归的话就是重复调用方法直到满足条件为止就停止这个方法,就跟循环类似,不过循环使用的方法一边比较简单
问题十:递归的原理解释 递归的底层实现其实是一个栈.栈的特点是后进先出,也就是最后进入栈的事件是最先被处理的.
递归就是这样运作.比如计算阶乘函数F(n)=n!=n*F(n-1)=....
写成递归,我用java
public static long F(long num){
if(num