| |
|
首页 -> 象棋 -> ??在棋盘上所有的点都能跳到吗 -> 正文阅读 |
[象棋]??在棋盘上所有的点都能跳到吗[第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,输给了兵五进一开局还诬陷我 |
太尉了,可以去棋滩和公园称霸了吧? |
菜菜问:对付当头炮,怎么最有效? |
讨论一下这个棋局,红方是否能胜? |
华山最后一把,又败给了时间 |
这盘残局摆在街头,绝对大杀四方! |
上一篇文章 下一篇文章 查看所有文章 |
|
娱乐生活:
电影票房
娱乐圈
娱乐
弱智
火研
中华城市
印度
仙家
六爻
佛门
风水
古钱币交流专用
钓鱼
双色球
航空母舰
网球
乒乓球
中国女排
足球
nba
中超
跑步
象棋
体操
戒色
上海男科
80后
足球: 曼城 利物浦队 托特纳姆热刺 皇家马德里 尤文图斯 罗马 拉齐奥 米兰 里昂 巴黎圣日尔曼 曼联 |
网站联系: qq:121756557 email:121756557@qq.com 知识库 |