马踏棋盘算法

最近在学习深度优先搜索算法,接触到了马踏棋盘,决定尝试一下。

涉及算法:递归,回溯法,深度优先搜索算法

题目需求:国际象棋的棋盘为8*8的方格,现将"马"放在任意制定的方格中,按照"马"走棋的规则将"马"进行移动。要求每个方格只能进入一次,最终使得"马"走遍棋盘的64个方格。

编写代码,实现马踏棋盘的操作要求用1~64来标注"马"移动的路径。

国际象棋的马在走法上与象棋有相似之处,但是国际象棋是站在在格子里边的,而象棋站线的交界处,

具体的上图吧


国际象棋马的走法


图中0-7八个位置就是马可以行走的下一步,于是,体现在代码上就是下面的next()函数horse()就是算法的核心了,运用递归+回溯。

由于8*8的方格可能出现的情况真的是太多了,要找到马踏遍整个棋盘而且不重复真是挺不容易的,需要很长时间,心疼我的CPU啊。 在这里可以把X Y 的值改为5或者6去测试,这样就快多了。调用time.h头文件就可以测试出来程序运行的用时

多说无用,上代码

#include
#include
#define X 8
#define Y 8
int chess[X][Y];
//找到基于(x,y)位置的下一个可走的位置
int next(int *x,int *y,int step){
switch(step){
case 0:
if( *y+2<=Y-1 && *x-1>=0 && chess[*x-1][*y+2] == 0 ){
*x-=1;
*y+=2;
return 1;
}
break;
case 1:
if( *y+2<=Y-1 && *x+1<=X-1 && chess[*x+1][*y+2]==0 ){
*x+=1;
*y+=2;
return 1;
}
break;
case 2:
if( *y+1<=Y-1 && *x+2<=X-1 && chess[*x+2][*y+1]==0){
*y+=1;
*x+=2;
return 1;
}
break;
case 3:
if( *y-1>=0 && *x+2<=X-1 && chess[*x+2][*y-1]==0){
*y-=1;
*x+=2;
return 1;
}
break;
case 4:
if( *y-2>=0 && *x+1<=X-1 && chess[*x+1][*y-2]==0){
*y-=2;
*x+=1;
return 1;
}
break;
case 5:
if( *y-2>=0&&*x-1>=0&& chess[*x-1][*y-2]==0){
*y-=2;
*x-=1;
return 1;
}
break;
case 6:
if( *y-1>=0&&*x-2>=0&&chess[*x-2][*y-1]==0){
*y-=1;
*x-=2;
return 1;
}
break;
case 7:
if( *y+1<=Y-1&&*x-2>=0&&chess[*x-2][*y+1]==0){
*y+=1;
*x-=2;
return 1;
}
break;
default:
break;
}
return 0;
}
//打印输出棋盘
void print(){
int i,j;
for(i=0;i
for(j=0;j
printf("%2d ",chess[i][j]);
}
printf("\n");
}
}
int horse(int x,int y,int tag){
int x1=x;int y1=y;
int flag =0,count=0;
chess[x][y]=tag;
if(tag==X*Y){
print();
return 1;
}
flag = next(&x1,&y1,count);
while(!flag && count<=7){
count++;
flag=next(&x1,&y1,count);
}
while(flag){
if(horse(x1,y1,tag+1)){
return 1;
}
x1 = x;
y1 = y;
count++;
flag=next(&x1,&y1,count);
while(!flag && count<=7){
count++;
flag=next(&x1,&y1,count);
}
}
if(!flag){
chess[x][y]=0;//回溯
}
return 0;
}
int main(){
int i,j;
for(i=0;i
for(j=0;j
chess[i][j]=0;
}
}

clock_t begin,end;
begin=clock();
if(!horse(2,0,1)){
printf("马踏棋盘失败!\n");
}
end = clock();
printf("共计用时:%lf\n",(double)(end-begin)/CLOCKS_PER_SEC);

return 0;
}



6*6棋盘运行结果截图:

运行结果

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容