独立钻石跳棋问题的C - 范文中心

独立钻石跳棋问题的C

08/28

独立钻石跳棋问题的C++实现

/**********************************说明

***********************************/

/*

问题描述:

独立钻石跳棋问题。在下图中,33个方格顶点摆放着32枚棋子,仅中央的顶点空着未摆放棋子。

下棋的规则是任一棋子可以沿水平或成垂直方向跳过与其相邻的棋子,进入空着的顶点并吃掉被跳过的棋子。

试设计一个算法找出一种下棋方法,使得最终棋盘上只剩下一个棋子在棋盘中央。

0------------------------->x

| 01 2 3456

| * * * 0 3

| * * * 1 |

| * * * * * * * 2 |

| * * * . * * * 3 方向确定规定为: 20

| * * * * * * * 4 |

| * * * 5 |

| * * * 6 1

y

*/

/*************************************************************************/

#include

#include

using namespace std;

struct step //记录移动棋子的信息

{

int sx, sy; // 记录移动棋子前棋子的位置

int tx, ty; // 记录移动棋子后棋子的位置

int dir; // dir值代表移动棋子的方向

};

struct step mystack[100], last_step;

char diamond[7][7];

int Left_diamond = 32;

int x, y, nx, ny, ndir, top; // ndir值代表方向, 0代表向右, 1代表向下, 2代表向左, 3代表向上

int flag=1; // 是否成功找到解的标志

/*****************************初始化棋盘

*****************************/

void Init_diamond()

{

for(int i=0; i

for(int j=0; j

{

if((i4) && (j4));

else

{

diamond[i][j] = '*';

}

}

}

diamond[3][3] = '.';

}

/*********************************************************************/

/*******************************移动棋子

******************************/

int Move_diamond(int y, int x, int dir)

{

if(diamond[y][x] != '*')

{

return 0;

}

struct step temp;

switch(dir)

{

case 0:

if(x+2>6 || diamond[y][x+1]!='*' || diamond[y][x+2]!='.')

{

return 0;

}

diamond[y][x] = diamond[y][x+1] = '.';

diamond[y][x+2] = '*';

temp.sx = x;

temp.sy = y;

temp.tx = x+2;

temp.ty = y;

temp.dir = dir;

mystack[top++] = temp;

return 1;

break;

case 1:

if(y+2>6 || diamond[y+1][x]!='*' || diamond[y+2][x]!='.')

{

return 0;

diamond[y][x] = diamond[y+1][x] = '.';

diamond[y+2][x] = '*';

temp.sx = x;

temp.sy = y;

temp.tx = x;

temp.ty = y+2;

temp.dir = dir;

mystack[top++] = temp;

return 1;

break;

case 2:

if(x-2

{

return 0;

}

diamond[y][x] = diamond[y][x-1] = '.';

diamond[y][x-2] = '*';

temp.sx = x;

temp.sy = y;

temp.tx = x-2;

temp.ty = y;

temp.dir = dir;

mystack[top++] = temp;

return 1;

break;

case 3:

if(y-2

{

return 0;

}

diamond[y][x] = diamond[y-1][x] = '.';

diamond[y-2][x] = '*';

temp.sx = x;

temp.sy = y;

temp.tx = x;

temp.ty = y-2;

temp.dir = dir;

mystack[top++] = temp;

return 1;

break;

default:

break;

}

return 0;

}

/*********************************************************************/

/*******************************主函数

********************************/

void main()

{

// 输出一个解到文本文件answer.txt

ofstream answer("answer.txt");

Init_diamond();

top = nx = ny = ndir = 0;

// 回溯遍历,直到找到一个解

while(1)

{

if(Left_diamond == 1 && diamond[3][3] == '*')

{

break;

}

for(y=ny; y

{

for(x=nx; x

{

for(int dir=ndir; dir

{

if(Move_diamond(y, x, dir))

{

Left_diamond--;

nx = ny = ndir = 0;

goto nextstep;

}

}

}

}

nextstep:

if(y == 7)

{

top--;

// 回到上一步, 并改变方向

if(top >= 0)

{

last_step = mystack[top];

diamond[(last_step.sy + last_step.ty)/2][(last_step.sx + last_step.tx)/2] = '*'; diamond[last_step.sy][last_step.sx] = '*';

diamond[last_step.ty][last_step.tx] = '.';

nx = last_step.sx;

ny = last_step.sy;

ndir = last_step.dir + 1;

Left_diamond++;

}

else

{

answer

cout

flag=0;

break;

}

}

}

Init_diamond();

answer

for(int i=0; i

{

for(int j=0; j

{

answer

}

answer

}

answer

// 输出解

for(int n=0; n

{

answer

("

diamond[mystack[n].sy][mystack[n].sx] = '.';

diamond[(mystack[n].sy+mystack[n].ty)/2][(mystack[n].sx+mystack[n].tx)/2] = '.';

diamond[mystack[n].ty][mystack[n].tx] = '*';

answer

for(int k=0; k

{

for(int j=0; j

{

answer

}

answer

}

answer

}

if(flag)

{

cout

}

}

/*********************************************************************/


相关内容

  • 国际跳棋计划
    2012-2013学年度第一学期国际跳棋活动计划 国际跳棋活动在于培养学生对智力游戏的兴趣.爱好.增长知识.提高技能.丰富学生的课余文化生活,为今后培养国际跳棋特长人才起着积极推动的作用.为了能够更好的开展好国际跳棋活动,是普及和提高国际跳 ...
  • 国际跳棋课本
    目 录 前言------------------------------- 第一章 概说--------------------------- 第二章 基础知识------------------------- 第三章 战略战术------ ...
  • 浅析张爱玲的爱情观
    浅析张爱玲的爱情观 刘 畅 (西华师范大学文学院.四川南充630007) 摘要:爱情是一个永恒的话题.但是,张爱玲笔下的爱情却没有常人想象得那么美好.她所描写的爱情是那样可望而不可及.她在爱情观上持悲观的态度.不论小说中人物对命运是积极抗争 ...
  • 初一数学配套问题应用题练习
    1. 班主任张老师带五年级(7)班50名同学栽树,张老师栽5棵,男生每人栽3棵, 女生每人栽2棵,总共栽树120棵,问几名男生,几名女生? 2. 大油瓶一瓶装4千克,小油瓶2瓶装1千克,现有100千克油装了共60个瓶子. 问大小油瓶各多少个 ...
  • 钻石基础知识
    钻 石 ⏹ 钻石的形成及开采 钻石昃碳在极高温及高压的情况下形成的结晶体.当火山爆发时,带着钻石的熔岩便冲火山活跃度减退,熔冷却,钻石便留在已凝固的岩浆内. ⏹ 钻石的产地 主要8大产地未来源: 澳州.扎伊尔.博茨瓦纳.苏联.南非.安哥拉. ...
  • 20**年关于组织开展国庆节文体娱乐活动12
    关于组织开展国庆节文体娱乐活动的通知 为丰富职工业余文化生活,活跃项目部气氛,增强员工的凝聚力和向心力,加强部门员工之间的交流与沟通,营造项目部团结和谐.积极向上的氛围,项目部决定在国庆期间组织系列文体娱乐活动,现将拟定活动计划通知如下: ...
  • 珠宝专业知识培训
    秦龙专业知识培训 一.钻石(diamond ) 1.成份:主要是碳c (含量占99.95%) 以及其它微量元素. 2.物理性质: (1)硬度:H=10, 自然界最坚硬的物质,是九级红蓝宝硬度的150倍. (2)颜色:以无色白色为主还有黄.棕 ...
  • 6 理解记叙文中重点句子的含义
    6 如何理解记叙文中重点句子的含义 [技巧指导] 记叙文阅读重点考查我们对阅读材料的综合理解能力,综合考查我们在阅读过程中的感受.体验.理解和价值取向,重视对探究性阅读和创造性阅读能力的考查.具体说来,要求如下: 1. 能理清思路,理解作品 ...
  • 李阳疯狂英语学习方法
    李阳疯狂英语学习方法 (2009-05-27 07:07:07)转载标签: 教育 一.两个中心:一.口语中心论学语言就是学习说!口语就是一切!语言是用来交流的,而交流大部分时候是通过嘴巴来完成的,是通过说来完成的!学习英语也是这样,想学好英 ...
  • 街道五四青年节纪念活动方案
    今年是"五四"运动**周年和建团**周年.为了进一步弘扬"爱国.进步.民主.科学"的"五四"精神,引导全处广大团员青年坚定理想信念,以更加饱满的工作热情和奋发有为的精神状态,积极投 ...