| |
|
| 首页 -> 象棋 -> ??在棋盘上所有的点都能跳到吗 -> 正文阅读 |
[象棋]??在棋盘上所有的点都能跳到吗[第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 知识库 |