社区
C++ 语言
帖子详情
大侠们,我遇到了一个马的遍历问题,麻烦帮我一下忙,十分感谢
dimpledashi
2004-12-21 04:04:07
题目如下:
设计程序完成如下要求:在中国象棋棋盘上,对任一位置上放置的一个马,均能选择合适
的路线,使得该棋子能够按象棋的规则不重复的走过棋盘上的每一个位置。
要求:
1.依次输出所走过的各位置的坐标。
2.画出棋盘的图形形式,并在其上动态的标注行走过程。
3.程序能方便的移植到其他规格的棋盘上。
...全文
238
11
打赏
收藏
大侠们,我遇到了一个马的遍历问题,麻烦帮我一下忙,十分感谢
题目如下: 设计程序完成如下要求:在中国象棋棋盘上,对任一位置上放置的一个马,均能选择合适 的路线,使得该棋子能够按象棋的规则不重复的走过棋盘上的每一个位置。 要求: 1.依次输出所走过的各位置的坐标。 2.画出棋盘的图形形式,并在其上动态的标注行走过程。 3.程序能方便的移植到其他规格的棋盘上。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
双杯献酒
2004-12-22
打赏
举报
回复
不是每种规格的棋盘都能够吧。
dimpledashi
2004-12-22
打赏
举报
回复
各位大侠,很感谢你们的回答
可是能不能画出棋盘的图形形式,并在其上动态的标注行走过程呢?
pzcai
2004-12-21
打赏
举报
回复
我问一下_______
| | |
-------
这个格子怎么遍历,其他照搬好了么,所以不是所有棋盘格式都能的
Bread_0053
2004-12-21
打赏
举报
回复
看来今天写不出来了,有个算法大家参考。。。。
1将原图G按某种方式分成m个子图G1,G2,…,Gm
2在每个子图Gi中,找出它们的一个顶点覆盖子圈—道路集
3对各子图Gi的顶点覆盖子圈—道路集中的子圈和道路进行合并
4在各子图之间进行子圈—道路或子圈—子圈的合并,直到不能合并为止
5若产生了一个圈或一条道路,则输出后结束,否则改变图G的分块方式或分块数后转2继续进行
whanlx
2004-12-21
打赏
举报
回复
我只得到一组值,肯能有错误,你试试吧
#include "stdafx.h"
#include <afxtempl.h>
#include <fstream>
using namespace std;
#define UNATATACH 0
#define ATATACH 1
CList<CPoint ,CPoint> Stack;
void FindPath(int ChessBoard[][9],int row,int col);
int CheckPos(int ChessBoard[][9],int row,int col)
{
if(0<=row&&row<10&&0<=col&&col<9&&ChessBoard[row][col]==UNATATACH)
{
if(Stack.GetCount()==88) return 1;
else return 0;
}
else return -1;
}
void Save()
{
fstream OutFile;
OutFile.open("c:\\aaa.txt",ios::ate|ios::out|ios::trunc);
POSITION pos = Stack.GetHeadPosition();
while(pos)
{
CPoint p = Stack.GetNext(pos);
char s[100];
sprintf(s,"%d,%d\r\n",p.x,p.y);
OutFile.write(s,strlen(s));
}
OutFile.close();
}
void TryPath(int ChessBoard[][9],int row,int col,int Iflast)
{
int ret = CheckPos(ChessBoard,row,col);
if(ret==1)
{
Save();
ChessBoard[row][col]=0;
}
if(ret==0)
{
Stack.AddTail(CPoint(row,col));
ChessBoard[row][col]=1;
FindPath(ChessBoard,row,col);
}
if(ret==-1)
{
if(Iflast==1)
{
if(Stack.IsEmpty()) Stack.RemoveTail();
}
}
}
void FindPath(int ChessBoard[][9],int row,int col)
{
TryPath(ChessBoard,row+1,col+2,0);
TryPath(ChessBoard,row+1,col-2,0);
TryPath(ChessBoard,row-1,col+2,0);
TryPath(ChessBoard,row-1,col-2,0);
TryPath(ChessBoard,row+2,col+1,0);
TryPath(ChessBoard,row+2,col-1,0);
TryPath(ChessBoard,row-2,col+1,0);
TryPath(ChessBoard,row-2,col-1,1);
}
int Horse(int row,int col)
{
if(0<=row&&row<10&&0<=col&&col<9)
{
int ChessBoard[10][9]={{0}};
ChessBoard[row][col]=1;
FindPath(ChessBoard,row,col);
return 0;
}
else return -1;
}
Bread_0053
2004-12-21
打赏
举报
回复
呵呵,今天正好学到这里,理论上这是一个np完全问题,穷举的话,一般的巨型机要算10^27年。。。。可以算出一个部分解,等我写一下,大约晚上贴出来给大家看看
Michael_555
2004-12-21
打赏
举报
回复
上面的MAX定义成了8。
下面的代码是一个在5*5的棋盘上的跳马问题。只输出了所走过的各位置的坐标。
#include "stdio.h"
#define MAX 5
int a[MAX][MAX];
int b[MAX*MAX],c[MAX*MAX];
int scheme;
//显示符合规则的跳马方案
void print(void)
{
int i;
for(i=0;i<MAX*MAX-1;i++)
printf("(%d,%d)\t",c[i],b[i]);
//统计方案总数
++scheme;
printf("\n");
}
//跳马函数,通过递归调用,寻找下一步的位置
int horse(int x,int y,int step)
{
int i,j;
//标识棋子在棋盘中的当前位置已跳过
a[x][y]=1;
//记录棋子在棋盘中的当前位置
b[step]=x;
c[step]=y;
//判断是否找到符合规则的完整的跳马方案(跳马步数为24步时)
if(step>=MAX*MAX-1)
print(); //打印完整的跳马路径
//寻找下一步位置,共有八种可选位置,逐一迳行试探,
//如果符合要求(此位置不越界,在棋盘内,且此点未被跳过),
//则继续递归调用寻找此位置的下一位置,如此点不符合要求,
//则返回0,递归回退。
if((i=x+1)>=0 && (i=x+1)<MAX && (j=y+2)>=0 && (j=y+2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+2)>=0 && (i=x+2)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+2)>=0 && (i=x+2)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+1)>=0 && (i=x+1)<MAX && (j=y-2)>=0 && (j=y-2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-1)>=0 && (i=x-1)<MAX && (j=y+2)>=0 && (j=y+2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-2)>=0 && (i=x-2)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-2)>=0 && (i=x-2)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-1)>=0 && (i=x-1)<MAX && (j=y-2)>=0 && (j=y-2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
//对没找到合适位置的处理
//至当前位置状态为0,恢复未跳过状态
a[x][y]=0;
//清除设置记录跳过位置的坐标
b[step]=c[step]=-1;
return 0;
}
int main(int argc, char* argv[])
{
int i,j;
//初始化棋盘位置
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
a[i][j] = 0;
//初始化记录坐标数组
for(i=0;i<MAX;i++)
b[i] = c[i] = -1;
//寻找符合要求的方案
horse(0,0,0);
printf("There are %d schemes\n",scheme);
return 1;
}
Michael_555
2004-12-21
打赏
举报
回复
下面的代码是一个在5*5的棋盘上的跳马问题。只输出了所走过的各位置的坐标。
#include "stdio.h"
#define MAX 8
int a[MAX][MAX];
int b[MAX*MAX],c[MAX*MAX];
int scheme;
//显示符合规则的跳马方案
void print(void)
{
int i;
for(i=0;i<MAX*MAX-1;i++)
printf("(%d,%d)\t",c[i],b[i]);
//统计方案总数
++scheme;
printf("\n");
}
//跳马函数,通过递归调用,寻找下一步的位置
int horse(int x,int y,int step)
{
int i,j;
//标识棋子在棋盘中的当前位置已跳过
a[x][y]=1;
//记录棋子在棋盘中的当前位置
b[step]=x;
c[step]=y;
//判断是否找到符合规则的完整的跳马方案(跳马步数为24步时)
if(step>=MAX*MAX-1)
print(); //打印完整的跳马路径
//寻找下一步位置,共有八种可选位置,逐一迳行试探,
//如果符合要求(此位置不越界,在棋盘内,且此点未被跳过),
//则继续递归调用寻找此位置的下一位置,如此点不符合要求,
//则返回0,递归回退。
if((i=x+1)>=0 && (i=x+1)<MAX && (j=y+2)>=0 && (j=y+2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+2)>=0 && (i=x+2)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+2)>=0 && (i=x+2)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x+1)>=0 && (i=x+1)<MAX && (j=y-2)>=0 && (j=y-2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-1)>=0 && (i=x-1)<MAX && (j=y+2)>=0 && (j=y+2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-2)>=0 && (i=x-2)<MAX && (j=y+1)>=0 && (j=y+1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-2)>=0 && (i=x-2)<MAX && (j=y-1)>=0 && (j=y-1)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
if((i=x-1)>=0 && (i=x-1)<MAX && (j=y-2)>=0 && (j=y-2)<MAX && !a[i][j])
if(horse(i,j,step+1))
return 1;
//对没找到合适位置的处理
//至当前位置状态为0,恢复未跳过状态
a[x][y]=0;
//清除设置记录跳过位置的坐标
b[step]=c[step]=-1;
return 0;
}
int main(int argc, char* argv[])
{
int i,j;
//初始化棋盘位置
for(i=0;i<MAX;i++)
for(j=0;j<MAX;j++)
a[i][j] = 0;
//初始化记录坐标数组
for(i=0;i<MAX;i++)
b[i] = c[i] = -1;
//寻找符合要求的方案
horse(0,0,0);
printf("There are %d schemes\n",scheme);
return 1;
}
ewayne
2004-12-21
打赏
举报
回复
递归,回溯!
xinde
2004-12-21
打赏
举报
回复
呵呵,有挑战性啊.
autoegg
2004-12-21
打赏
举报
回复
楼主需要大家怎么帮助你呢?给思路?给设计?给代码?
二叉树前序中序后序源代码 C语言,二叉树的建立,前序、中序和后序
遍历
二叉树的建立,前序、中序和后序
遍历
老师布置的作业。
麻烦
大家解答下。谢谢~~要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序
遍历
的操作,求所有叶子及结点总数的操作等。具体实现要求:1. 二叉树采用链接存储结构,其根结点指针为T,设计
一个
算法对这棵二叉树的每个结点赋值2. 分别利用前序
遍历
、中序
遍历
、后序
遍历
所建二叉树。(输出
遍历
结果)3. 求二叉树结点总数,观察输出...
2016 UESTC Training for Data Structures L - 郭
大侠
与苦恼 CDOJ 1284 map+启发式合并
L - 郭
大侠
与苦恼 题目简单,就是给你一棵树,然后问异或值为0的简单路径有多少条 好难,好
麻烦
,想了好久才想明白 按dfs的顺序来map+启发式合并, 后来想找个题的大概框架和树形01背包相似,都是用dfs来实现的,只不过树形01背包dfs后的过程是背包的合并,这个是map的合并,还是启发式合并(就是把size小的合并到size大的上), 然后我们这里维护的是pre[u],就是从根
php 判断在两个值之间,PHP 关于比较两个数组的
问题
值判断输出的
问题
从两个表中取出两组数据,分别存入 $malls 和 $mall_tems现在需要
遍历
比较两个数组,如果记录的 color_id 和 size_id 相同,就取出 $mall 的 price 值存入 $malls_tem 的 price 字段中现在使用以下 foreach 循环,但是不成功,
麻烦
各位
帮
忙
看看哪里不对。foreach($mall_tems as $mall_tem){ // 使用...
PHP签到加备注源码,这个php签到源码,我如果想把两个帐号固定内置在代码里,要怎么写呢? @sibang
大侠
谢谢!...
本帖最后由 tangdeli98 于 2013-12-17 15:08:00 编辑下面这个php签到源码,我如果想把两个帐号固定内置在代码里,要怎么写呢? (
感谢
sibang
大侠
,昨天
帮
我修改的代码.)我不会php,只做桌面软件.我自己试图下面这样改,按我做桌面软件的逻辑应该是可以的,就是变量不断重新赋值然后执行命令.但是改后的php代码报部署不成功,应该是有错.要怎么写呢?我想一次性签多个帐号,...
一个
ForkJoin并行任务的实际应用
先交代背景,因为我有好多照片存在不同的电脑和移动硬盘备份,平时又喜欢摄影,有时候相机的照片和手机拍的需要同步到所有设备,保证所有设备上的照片都是一样的,但是有时候会各种原因导致图片不同步,人为查找排除很
麻烦
何况我有10000+照片(其实里面没有几张自己的。。),首先想到的是根据文件名判重,考虑到会有重名的文件,严谨起见采取对照片摘要MD5,再去判重
C++ 语言
65,214
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章