万年历 购物 网址 日历 小说 | 三峰软件 天天财富 小游戏 视频推荐 小游戏
TxT小说阅读器
↓小说语音阅读,小说下载↓
一键清除系统垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放,产品展示↓
首页  日历2023  日历2024  日历2025  日历知识  | 每日头条  视频推荐  数码知识 两性话题 情感天地 心理咨询 旅游天地 | 明星娱乐 电视剧  职场天地  体育  娱乐 
日历软件  煮酒论史  历史 中国历史 世界历史 春秋战国 三国 唐朝 宋朝 明朝 清朝 哲学 厚黑学 心理学 | 文库大全  文库分类 
电影票房 娱乐圈 娱乐 弱智 火研 中华城市 仙家 六爻 佛门 风水 钓鱼 双色球 戒色 航空母舰 网球 乒乓球 足球 nba 象棋 体操
    
  首页 -> 象棋 -> ??在棋盘上所有的点都能跳到吗 -> 正文阅读

[象棋]??在棋盘上所有的点都能跳到吗[第8页]

作者:牵牛花的羁绊
首页 上一页[7] 本页[8] 下一页[9] 尾页[11] [收藏本文] 【下载本文】
 
只要证一个3x4,也就是12个点都能跳到,就可以推出所有点都能跳到了,证3x4用枚举
 
骑士巡航问题,中国象棋不知道可不可以,但是国际象棋上可以不重复的经过每一个格子
 
找个棋盘一顿走就知道了~水贴误事啊!
 
車马炮可以走遍任何位置
 
可以
 
哦,等等,好像我读错题了
可以,时间问题而已
 
作为主要攻击性棋子,有盲点还不是致命短版
 
黑白染色就可以证明了
 
四个角都能跳到,其他那就更没问题了
 
确实可以
 
可恶,昨天刚上的图
 
//C++实现,这里是代码,有兴趣可能私我要编译好的程序,待会我贴搜索好的其中一个结果
//引入头文件
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
//引入名命空间
using namespace std;
//八个方向向量,不考虑蹩马腿情况
const int direct[][2]={{2,1},{-2,1},{2,-1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
//方向個數
const int directLength=8;
//二维棋盘
int board[100][100]={0};
//最大点数
int maxNumber=10000;
//棋盘规格
int row=10;
int col=9;
//其实位置
int startX=0;
int startY=0;
class path
{
public:
int x;
int y;
int mayCount;
};
//路径比较,下一步可能小者优先
bool comparePath(path p1,path p2)
{
return p1.mayCount<p2.mayCount;
}
//显示棋盘搜索结果
void displayBoard()
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
printf("%-3d",board[i][j]);
}
cout<<endl;
}
cout<<endl;
}
//坐标是否合法
bool isPointLegal(int i,int j)
{
return i<row&&i>=0&&j<col&&j>=0&&board[i][j]==0;
}
//某一点下一步的可能种数
path mayPathCount(int i,int j)
{
int result=0;
int x,y;
for(int k=0;k<directLength;k++)
{
x=i+direct[k][0];
y=j+direct[k][1];
if(isPointLegal(x,y))
{
result++;
}
}
path p;
p.x=i;
p.y=j;
p.mayCount=result;
return p;
}
//某个点的下一步可能性,并按下一步的下一步可能种数少者优先进行排序
vector<path> mayPath(int i,int j)
{
vector<path> ps;
int x,y;
for(int k=0;k<directLength;k++)
{
x=i+direct[k][0];
y=j+direct[k][1];
ps.push_back(mayPathCount(x,y));
}
//按下一步可能性小的优先进行排序
sort(ps.begin(),ps.end(),comparePath);
return ps;
}
//深度优先搜索方法
void dfs(int i,int j,int number)
{
//坐标不合法则没必要继续计算
if(!isPointLegal(i,j))
{
return;
}
//試探性走
board[i][j]=number;
//已经求解出一个合适解法则退出
if(number>=maxNumber)
{
displayBoard();
exit(0);
}
int x,y;
vector<path> ps=mayPath(i,j);
//分別沿八個方向搜索可能性
for(int k=0;k<ps.size();k++)
{
x=ps[k].x;
y=ps[k].y;
dfs(x,y,number+1);
}
//试探失败,进行回撤
board[i][j]=0;
}
void noSolution()
{
cout<<"该情况无解"<<endl;
}
//主函数
int main(int argc,char* argv[])
{
//可变规格,默认10行9列的中国象棋棋盘
if(argc==3)
{
sscanf(argv[1],"%d",&row);
sscanf(argv[2],"%d",&col);
}
else if(argc==5)
{
sscanf(argv[1],"%d",&row);
sscanf(argv[2],"%d",&col);
sscanf(argv[3],"%d",&startX);
sscanf(argv[4],"%d",&startY);
}
//规格变化时,最大点数也会随之变化
maxNumber=row*col;
cout<<"当前求解规格:"<<endl;
cout<<"row="<<row<<","<<"col="<<col<<endl<<endl;
cout<<"选择起始位置[x,y]:"<<endl;
cout<<"["<<startX<<","<<startY<<"]"<<endl<<endl;
cout<<"求解中..."<<endl<<endl;
//求解函数,若有结果则会输出结果并退出程序
dfs(startX,startY,1);
noSolution();
return 0;
}
 
金戈铁马,势不可挡
 
马三步能跳相邻的点 自然可以整个棋盘跳到
 
写个搜索就解决
首页 上一页[7] 本页[8] 下一页[9] 尾页[11] [收藏本文] 【下载本文】
  象棋 最新文章
感觉学1大部分人有一定的水平,并不是刚学会
象棋名手被“县冠”乱砍
为什么许仙连续12年等级分第一,我没见吹的
黑方有一招惊天妙手
遇到一个业9-2,输给了兵五进一开局还诬陷我
太尉了,可以去棋滩和公园称霸了吧?
菜菜问:对付当头炮,怎么最有效?
讨论一下这个棋局,红方是否能胜?
华山最后一把,又败给了时间
这盘残局摆在街头,绝对大杀四方!
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 00:17:10  更:2021-12-16 00:22:58 
 
娱乐生活: 电影票房 娱乐圈 娱乐 弱智 火研 中华城市 印度 仙家 六爻 佛门 风水 古钱币交流专用 钓鱼 双色球 航空母舰 网球 乒乓球 中国女排 足球 nba 中超 跑步 象棋 体操 戒色 上海男科 80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联
  网站联系: qq:121756557 email:121756557@qq.com  知识库