資源簡介
馬的Hamilton周游路線問題,8*8 的國際象棋棋盤上的一只馬,恰好走過除起點外的其它63 個位置各一次,最后回 到起點。這條路線稱為一條馬的Hamilton 周游路線。對于給定的m*n 的國際象棋棋盤,m和n均為大于5 的偶數,且|m-n|≤2,該算法找出一條馬的Hamilton周游路線。-

代碼片段和文件信息
#include?
#include?
/**//**/
//棋盤行數
const?int?N?=?6;
int?step[N?*?N]?=?{-1};?//保存每一步做出的選擇
int?chess[N][N]?=?{0};?//棋盤
int?Jump[8][2]?=?{{-2?1}?{-1?2}?{1?2}?{2?1}?{2?-1}?{1?-2}?{-1?-2}?{-2?-1}};
int?p?=?0;//對解的個數計數
//判斷是否合法
char?s[20];
int?canJump(int?x?int?y)
{
????if?(x?>=?0?&&?x?=?0?&&?y?????????return?1;
????return?0;
}
//求權值
int?weightStep(int?x?int?y)
{
????int?count?=?0;
????for?(int?i?=?0;?i?8;?++i)
????{
????????if?(canJump(x?+?Jump[i][0]?y?+?Jump[i][1]))
????????????count++;
????}
????return?count;
}
//權值排序
void?inssort(int?a[]?int?b[]?int?n)
{
????if?(n?<=?0)?return;
????for?(int?i?=?0;?i?????{
????????for?(int?j?=?i;?j?>?0;?--j)
????????{
????????????if?(a[j]?????????????{
????????????????int?temp?=?a[j?-?1];
????????????????a[j?-?1]?=?a[j];
????????????????a[j]?=?temp;
????????????????
????????????????temp?=?b[j?-?1];
????????????????b[j?-?1]?=?b[j];
????????????????b[j]?=?temp;
????????????}
????????}
????}
}
//輸出結果
void?OutPutChess()
{
FILE?*fp;
if((fp=fopen(s“w“))==NULL)
{
printf(“cannot?open?file“);
exit(0);
}
????int?ijkl=0;
????for?(i?=?1;?i?<=?N?*?N?-?1;?++i)
????????{
????????????printf(“%d?“?step[i]);
????????}
????printf(“\n“);
????for(i=0;i ????{
????????for(int?j=0;j ????????????fprintf(fp“%3d?“chess[i][j]);
????????fprintf(fp“\n“);
????}
fprintf(fp“\n坐標表示結果:\n“);
for(i=1;i<=N*N;i++)
{
for(j=0;j {
for(k=0;k {
if(chess[j][k]==i)
{
fprintf(fp“(%d%d)???“jk);
}
}
}
l++;
if(l%6==0)
fprintf(fp“\n“);
}
fclose(fp);
}
//回溯算法
void?BackTrace(int?t?int?x?int?y)
{
????if?(t?>=?N?*?N)
????{
????????p++;
????????OutPutChess();//輸出結果
????????exit(1);???//求得一個解時退出程序
????????//return?;??//求得所有解
????}
????else
????{
????????int?i;
????????int?count[8]?possibleSteps[8];
????????int?k?=?0;
????????for?(i?=?0;?i?8;?++i)
????????{
????????????if?(canJump(x?+?Jump[i][0]?y?+?Jump[i][1]))
????????????{
????????????????count[k]?=?weightStep(x?+?Jump[i][0]?y?+?Jump[i][1]);?//求權值
????????????????possibleSteps[k++]?=?i;???//保存下一個結點的序號
????????????}
????????}
????????
????????inssort(count?possibleSteps?k);//排序
????????for?(i?=?0;?i?????????{
????????????int?d?=?possibleSteps[i];
????????????//跳向下一個結點
????????????x?+=?Jump[d][0];
????????????y?+=?Jump[d][1];
????????????chess[x][y]?=?t?+?1;
????????????step[t]?=?d;
????????????BackTrace(t?+?1?x?y);??//遞歸調用
????????????//回溯
????????????chess[x][y]?=?0;
????????????x?-=?Jump[d][0];
????????????y?-=?Jump[d][1];
????????????
????????}
????}
}
int?main()
{
????
????int?x?=?0;
????int?y?=?0;
????chess[x][y]?=?1;
sprintf(s“result.txt“);
????BackTrace(1?x?y);
system(“pause“);
return?0;
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3045??2010-05-06?22:02??Hamilton.cpp
-----------?---------??----------?-----??----
?????????????????3045????????????????????1
- 上一篇:CAN測試-發送接收數據MC9S12G128平臺測試
- 下一篇:代碼及原理圖 2
評論
共有 條評論