问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

关于国际象棋中马的贪心算法证明,严重头痛

发布网友 发布时间:2024-09-30 13:28

我来回答

1个回答

热心网友 时间:2024-10-03 00:28

【问题描述】
马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。
【初步设计】
首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下:
1、 输入初始位置坐标x,y;
2、 步骤 c:
如果c>64输出一个解,返回上一步骤c--
(x,y) ← c
计算(x,y)的八个方位的子结点,选出那此可行的子结点
循环遍历所有可行子结点,步骤c++重复2
显然(2)是一个递归调用的过程,大致如下:
void dfs(int x,int y,int count)
{
int i,tx,ty;
if(count>N*N)
{
output_solution();//输入一个解
return;
}
for(I=0;i<8;++i)
{
tx=hn[i].x;//hn[]保存八个方位子结点
ty=hn[i].y;
s[tx][ty]=count;
dfs(tx,ty,count+1);//递归调用
s[tx][ty]=0;
}
}
这样做是完全可行的,它输入的是全部解,但是马遍历当8×8时解是非常之多的,用天文数字形容也不为过,这样一来求解的过程就非常慢,并且出一个解也非常慢。
怎么才能快速地得到部分解呢?
【贪心算法】
其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法。在每个结点对其子结点进行选取时,优先选择‘出口’最小的进行搜索,‘出口’的意思是在这些子结点中它们的可行子结点的个数,也就是‘孙子’结点越少的越优先跳,为什么要这样选取,这是一种局部调整最优的做法,如果优先选择出口多的子结点,那出口少的子结点就会越来越多,很可能出现‘死’结点(顾名思义就是没有出口又没有跳过的结点),这样对下面的搜索纯粹是徒劳,这样会浪费很多无用的时间,反过来如果每次都优先选择出口少的结点跳,那出口少的结点就会越来越少,这样跳成功的机会就更大一些。这种算法称为为贪心算法,也叫贪婪算法或启发示算法,它对整个求解过程的局部做最优调整,它只适用于求较优解或者部分解,而不能求最优解。这样的调整方法叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。
在前面的算法基础之上,增添一些程序加以实现:
函数1:计算结点出口多少
int ways_out(int x,int y)
{
int i,count=0,tx,ty;
if(x<0||y<0||x>=N||y>=N||s[x][y]>0)
return -1;//-1表示该结点非法或者已经跳过了
for(i=0;i<8;++i)
{
tx=x+dx[i];
ty=y+dy[i];
if(tx<0||ty<0||tx>=N||ty>=N)
continue;
if(s[tx][ty]==0)
++count;
}
return count;
}
函数2:按结点出口进行排序
void sortnode(h_node *hn,int n)//采用简单排序法,因为子结点数最多只有8
{
int i,j,t;
h_node temp;
for(i=0;i<n;++i)
{
for(t=i,j=i+1;j<n;++j)
if(hn[j].waysout<hn[t].waysout)
t=j;
if(t>i)
{
temp=hn[i];
hn[i]=hn[t];
hn[t]=temp;
}
}
}
函数3:修改后的搜索函数
void dfs(int x,int y,int count)
{
int i,tx,ty;
h_node hn[8];
if(count>N*N)
{
output_solution();
return;
}
for(i=0;i<8;++i)//求子结点和出口
{
hn[i].x=tx=x+dx[i];
hn[i].y=ty=y+dy[i];
hn[i].waysout=ways_out(tx,ty);
}
sortnode(hn,8);
for(i=0;hn[i].waysout<0;++i);//不考虑无用结点
for(;i<8;++i)
{
tx=hn[i].x;
ty=hn[i].y;
s[tx][ty]=count;
dfs(tx,ty,count+1);
s[tx][ty]=0;
}
}
函数4:主调函数
void main()
{
int i,j,x,y;
for(i=0;i<N;++i)//初始化
for(j=0;j<N;++j)
s[i][j]=0;
printf("Horse jump while N=%d\nInput the position to start:",N);
scanf("%d%d",&x,&y);//输入初始位置
while(x<0||y<0||x>=N||y>=N)
{
printf("Error! x,y should be in 0~%d",N-1);
scanf("%d%d",&x,&y);
}
s[x][y]=1;
dfs(x,y,2);//开始搜索
}
关于国际象棋中马的贪心算法证明,严重头痛

实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。在前面的算法基础之上,增添一些程序加以实现:函数1:计算结点出口多少 int ways...

求用C语言编程实现一个国际象棋 马怎么走的问题

(3)本题用贪心法策略求解。 当马处于某一位置时,其选择下一位置的准则为:从马当前位置所允许走的位置中,选择出口数最少的哪个位置。如马的当前位置只有3个出口,它们的出口数分别为4,2,3,则程序就选择出口数为2的那个出口。 算法简单描述,马从棋盘第一行第一列位置开始出发;预设着法选择...

关于国际象棋中马的贪心算法证明 严重头痛啊

实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。在前面的算法基础之上,增添一些程序加以实现:函数1:计算结点出口多少 int ways...

国际象棋算象棋吗 国际象棋计算方法 国际象棋积分算法 国际象棋中间分计算 国际象棋两点可达算法 国际象棋和棋算谁赢 国际象棋计算 国际象棋等级分怎么算 国际象棋等级分计算公式
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的起源地懒在哪抓_我的起源地懒位置介绍 我的起源疯狂的地懒在哪介绍_我的起源疯狂的地懒在哪是什么 矿物质机油对车有哪些影响? 明月千里季相思多少诗人望月兴叹杜甫说( ) 明月千里寄相思。”多少诗人望月兴叹。杜甫说 10个精准拉伸动作,帮你改善身体僵硬和协调性 这么柔软修长的女人,男人肯定都爱 请问一个月自学能否过二级VB?怎样学才能事半功倍?? 清肠清肠的食物 找月嫂要注意什么如何找到合适的月嫂 电脑ID是什么意思啊? 什么叫电脑ID? 海天海苔不能和什么一起吃 海苔跟什么不能一起吃 从西安到九寨沟加团旅游(09年端午前后)那个好啊? 上海到成都-黄龙-九寨沟自由行 我想去九寨沟旅行 但不想入团 想自己一个人去 初步计划 花费是在3500... 华为手机小圆圈怎么取消掉华为手机小圆圈关掉的方法【教程】 男朋友脚控和男朋友剪女朋友脚指甲有没有点关系? 茶叶蛋,泡椒凤爪,玉米臭豆腐你喜欢哪个? 华为畅享10plus是闪充吗 华为畅享10闪充模式怎么开启 梦见小棉袄是什么意思? 我的苹果4s在没有电话进来的时候 静音键拨到下面 闹钟还会响 不是静... 梦见自己从楼上想下来被砖头赌住了 iPhone4S静音键的问题 苹果6里10.3系统里分析是诊断与用量吗 拼多多不是百亿补贴的是正品吗?拼多多非百亿补贴能买吗 在拼多多百亿补贴买手机是正品吗? 买韩国商品到哪家购物网站的商品全?? 马踏棋盘问题的回溯算法 手机怎样收不了红包和转账? 为什么手机转账和红包都不能用 元肉的功效与作用 元肉的好处 中药元肉是什么 如何通俗易懂的说明t分布和f分布和卡方分布呢? 华为畅享9s处理器是什么 ...梦见向自己喜欢的人表白,她拒绝了,这个梦代表着什么 ,意思是不是... 喜欢的男生拒绝我的表白,然后我晚上老是做梦梦见他我这是怎么... 怎么做元宵才好吃 梦见自己的手指被自己削肉了,没有出血也感觉不到疼痛 苹果手机可以把门禁卡等弄到手机里吗 苹果手机能把门禁卡等弄到手机... WPS文字中怎样去除图片的背景呢? WPS文字怎么提高图片质量? 质美包装制品有限公司主要生产哪些食品纸袋系列? 回收站被删除文件怎么恢复 生长因子填充面部能维持多久 提升面部术能维持多久 面部填充能保持多久 24节气养生法作者简介