您的位置:首页 > 其它

国际象棋跳马程序(自编码研究)

2015-08-14 15:46 519 查看
把马随机放到8*8的一个棋盘里,按照马的行走规则,每个方格进入一次,走遍64个方格,将数字依次填入8*8个方格内,使用递归,思路很明显,但是怎么选择递归的走路问题,按照如下走,大约需要8^64 <> 6.2*10^57 计算机根本搞不定!!!!

我的算法:

int hourse_run(Node tmp)

{

if ( hourse_run(Node(tmp.x+1,tmp.y+2)) )

goto L;

if ( hourse_run(Node(tmp.x+1,tmp.y-2)) )

goto L;

if ( hourse_run(Node(tmp.x-1,tmp.y+2)) )

goto L;

if ( hourse_run(Node(tmp.x-1,tmp.y-2)) )

goto L;

if ( hourse_run(Node(tmp.x+2,tmp.y+1)) )

goto L;

if ( hourse_run(Node(tmp.x-2,tmp.y+1)) )

goto L;

if ( hourse_run(Node(tmp.x+2,tmp.y-1)) )

goto L;

if ( hourse_run(Node(tmp.x-2,tmp.y-1)) )

goto L;

网上搜的算法:

board[x][y]=step;

int i,j; info dir[8];

for(i=j=0;i<8;++i)

if(x+dx[i]<0||y+dy[i]<0||x+dx[i]>=R||y+dy[i]>=C||board[x+dx[i]][y+dy[i]]) continue;

else

{

dir[j].x=x+dx[i];dir[j].y=y+dy[i];

dir[j].out=outlet(dir[j].x,dir[j].y);

sort(dir,++j);

}

for(i=0;i<j;++i)

if(search(dir[i].x,dir[i].y,step+1)) return true;

board[x][y]=0;

return false;

算法的精妙在于,让马优先按照边走,即优先让棋子的下一条的路最少的路走!!!!证明过程没有看懂:http://faculty.olin.edu/~sadams/DM/ktpaper.pdf;有看懂证明过程的可以给我留言
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: