象棋棋盘图90个点,马都能走到吗

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第十三讲__棋盘上的数学_-教师版
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口下次自动登录
现在的位置:
& 综合 & 正文
8*8国际象棋棋盘上,在0,0位置有一只马,求马不重复踩点连续走完棋盘上所有点的解决方案..(运行时间太长,大家一起验证..)
题目描述:在一个8X8的国际象棋棋盘上有一只位置第一行第一列的马。请输入这只马遍历棋盘上所有格子同时不重复经过任何一个格子的可行方案, 国际象棋子是在格子中间的,也就是在格子上的。
补充说明:象棋子是在点上的。搞清了这个,你就要正确理解国际象棋中的“马走日”,意思是马走的路线像象棋里的马走的路线一样,先走个直格或横格然后再走个斜格,而不是走斜格后走日字。你把格子当做象棋上点的放大就行了。
1.要能描绘棋盘和并记录所走步数与未走点,和当前点,使用二维数组描绘棋盘,元素值表示状态:
0,未走;&0,步数。棋盘元素最大值表示当前马的位置。
2.编写走步方法,期间找出当前步数是否已入死路或者造成某点不可达或者已完成(走到第64步完),若是,清除当前步,回退,进行上一步的下种步法;若否,再获得基于当前步数可走的步数集合,并走下一步。
3.解析数学规则.
1.解析题目为在一个8*8的二维数组里,外维表示纵坐标,其次表示横坐标;
2.记录当前步数index
3.每次只能:
1)维数+2/-2,横标+1/-1
2)维数+1/-1,横标+2/-2
最多共8种步法,最少当然是0种步法,注意判断数组是否越界
递归的层数实在太多..在经过造成明显递归溢出的bug后..貌似正常运行了..据我观察是这样..不过好像由于计算量庞大,运算下去好像内存就会不够了..所以没有得出运算结果...请各位也检验一下,程序中是否有bug以及更好的解决方案....
java code:
int[][] map={
{1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};//棋盘,0表示未踩,大于0的数表示步数,最大数表示当前马所在的位置
* 走下一步
* @param y 下一步的纵坐标 即外维坐标
* @param x 下一步的横坐标 即内维坐标
void walkNext(int y,int x){
if(isfinished()){//是否完成最后一步
printStreet();
}else if(!someoneDead(y,x)){//否是致使某点不可达
int[][] tempSteps=haveStep(y, x);
if(tempSteps==null||tempSteps.length==0){//是否已入死路
for(int i=0;i&tempSteps.i++){
map[tempSteps[i][0]][tempSteps[i][1]]=++//更新当前步
if(index&=46){//从此处到下面都是观察值
System.out.println("index="+index);
printStreet();
}//从本行到上面是观察值
walkNext(tempSteps[i][0], tempSteps[i][1]);//进入下一步
clearNowStep(y, x);
tempSteps=
//分析递归层级是否过高还是死循环,输出递归层数,观察是否维持在一个或某几个值上,若是 就是陷入死循环,否则就是正常
* 判断地图上是否有某点不可达
boolean someoneDead(int y,int x){
int[][]//临时存储某点的所有可走步骤的集合
int[][] nowT
for(int i=0;i&map.i++)
for(int j=0;j&map[i].j++)
if(map[i][j]==0&&((temp=haveStep(i, j))==null||temp.length==0)){//当某空节点的下步中没有空节点,并且含当前步时,返回false
nowTemp=haveStep(y,x);
for(int k=0;k&nowTemp.k++)
if(nowTemp[k][0]==i&&nowTemp[k][1]==j)
* 还原当前步
* @param y 纵坐标
* @param x 横坐标
void clearNowStep(int y,int x){
for(int i=0;i&map.i++)
for(int j=0;j&map[i].j++)
if(map[i][j]==index){
map[i][j]=0;
* 获得该点所有可能的步骤
* @param y
* @param x
* @return 可能步骤的坐标
int[][] haveStep(int y,int x){
int[][] steps=new int[8][2];//所有可达步法
int stepIndex=0;
int[][] stepkind={//步法种类
{-2,1},{-2,-1},{2,1},{2,-1},
{1,-2},{1,2},{-1,2},{-1,-2}
int tempX,tempY;//tempX,某种步法的可能步的横坐标;tempY,某种步法的可能步的纵坐标
final int maxY=map.length-1;//最大纵坐标
final int maxX=map[0].length-1;//最大横坐标
for(int i=0;i&stepkind.i++){
tempY=stepkind[i][0]+y;
tempX=stepkind[i][1]+x;
// 判断索引越界、已走过步点
if(tempY&maxY||tempY&0||tempX&maxX||tempX&0||map[tempY][tempX]!=0)
steps[stepIndex][0]=tempY;
steps[stepIndex++][1]=tempX;
//去掉steps中非步法数组,也就是冗余单位(初始化时设置外维数组长度为8,实际可能小于8)
int stepValid=-1;
for(int i=0;i&steps.i++)
if(steps[i][0]==0&&steps[i][1]==0){
stepValid=i;
if(stepValid!=-1){
int[][] resultStep=new int[stepValid][2];
for(int i=0;i&stepVi++){
resultStep[i][0]=steps[i][0];
resultStep[i][1]=steps[i][1];
return resultS
* 判断是否是最后一步
boolean isfinished(){
return index==64;
* 完成道路时输出所走路线
void printStreet(){
System.out.println("第"+(++solution)+"种走法如下(数字表示步法):");
for(int i=0;i&map.i++){
for(int j=0;j&map[i].j++)
System.out.print("—————");
System.out.print("\n|");
for(int j=0;j&map[i].j++)
System.out.print(" "+getStep(i,j)+" |");
System.out.print("\n");
for(int j=0;j&map[0].j++)
System.out.print("—————");
System.out.println("\n输出完成");
* 获得当前步数,用于统一输出步法显示格式为两位数
* @param y 纵坐标
* @param x 横坐标
* @return 当前步数
String getStep(int y,int x){
return map[y][x]&10?"0"+map[y][x]:map[y][x]+"";
static void test(){
System.out.println("测试开始");
ChessHorse ch=new ChessHorse();
ch.walkNext(0,0);
System.out.println("测试结束");
public static void main(String[] args) {
&&&&推荐文章:
【上篇】【下篇】中国象棋中规定:马走“日”字,象走“田”字,如图是中国象棋的半个棋盘(4×8个矩形,每个小方格都是单位正方形),若马在A处,可跳到A1,也可跳到A2,用向量,表示马走了“一步”,试在图中画出马在B、C处走了“一步”的所有情况.图2-1-4
中国象棋中规定:马走“日”字,象走“田”字.如下图是中国象棋的半个棋盘,若马在A处,可跳到A1,也可跳到A2,用向量,表示马走了“一步”,试在图中画出马在B、C处走了“一步”的所有情况.
如下图是中国象棋的半个棋盘,“马走日”是中国象棋的马的走法,如图马从A跑到A1,也可跳到A2,用向量,表示马走了“一步”.试在图中画出B、C走了“一步”的所有情况.
下图是中国象棋的半个棋盘,“马走日”是象棋中马的走法.如图,马可从A跳到A1,也可跳到A2,用向量、表示马走了一步,试在图中画出马在B、C处走了“一步”的所有情况.
精英家教网新版app上线啦!用app只需扫描书本条形码就能找到作业,家长给孩子检查作业更省心,同学们作业对答案更方便,扫描上方二维码立刻安装!

我要回帖

更多关于 中国象棋棋盘图 的文章

 

随机推荐