马的棋盘遍历

一个方棋盘(当然也可以是矩形的,这里我主要是为了声明数组方便把它定义成方棋盘),上面有一只马,打印出它走过这些所有位置各一次的全部可能走法。使用的是递归,没有用回溯。

None.gif#include "stdafx.h"
None.gif#include 
<iomanip>
None.gif
using namespace std;
None.gif
None.gif
void Hanmilton(int* a, int* b, int n, int i, int j, int progress)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
ExpandedSubBlockStart.gifContractedSubBlock.gif    
/**//*if (a[i * n + j])
InBlock.gif    {
InBlock.gif        return;
ExpandedSubBlockEnd.gif    }
*/

InBlock.gif    
for (int x = 0; x < progress - 1; x++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (b[x] == i * n + j)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
return;
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    a[i 
* n + j] = progress;
InBlock.gif    b[progress 
- 1= i * n + j;
InBlock.gif    
if (progress >= n * n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
for (int x = 0; x < n; x++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            
for (int y = 0; y < n; y++)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                cout 
<< setw(3<< a[x * n + y];
ExpandedSubBlockEnd.gif            }

InBlock.gif            cout 
<< endl;
ExpandedSubBlockEnd.gif        }

InBlock.gif        cout 
<< "=========end=======" << endl;
InBlock.gif        cout 
<< "\n===================" << endl;
InBlock.gif
InBlock.gif        
return;
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
if (i + 1 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (j + 2 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
+1, j+2, progress + 1);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (j - 2 >= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
+1, j-2, progress + 1);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
if (i - 1 >=0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (j + 2 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
-1, j+2, progress + 1);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (j - 2 >= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
-1, j-2, progress + 1);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    
if (i + 2 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (j + 1 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
+2, j+1, progress + 1);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (j - 1 >= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
+2, j-1, progress + 1);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

InBlock.gif    
if (i - 2 >= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        
if (j + 1 < n)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
-2, j+1, progress + 1);
ExpandedSubBlockEnd.gif        }

InBlock.gif        
if (j - 1 >= 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
dot.gif{
InBlock.gif            Hanmilton(a, b, n, i
-2, j-1, progress + 1);
ExpandedSubBlockEnd.gif        }

ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

None.gif
None.gif
int _tmain(int argc, _TCHAR* argv[])
ExpandedBlockStart.gifContractedBlock.gif
dot.gif{
InBlock.gif    
int n;
InBlock.gif    cin 
>> n;
InBlock.gif
InBlock.gif    
int* a = new int[n * n];//访问序号
InBlock.gif
    int* b = new int[n * n];//访问序列
InBlock.gif
    for (int i = 0; i < n * n; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif        a[i] 
= 0;
InBlock.gif        b[i] 
= -1;
ExpandedSubBlockEnd.gif    }

InBlock.gif    cout 
<< setw(3);
InBlock.gif    Hanmilton(a, b, n, 
001);
InBlock.gif
InBlock.gif    
return 0;
ExpandedBlockEnd.gif}

None.gif

转载于:https://www.cnblogs.com/preternatural/archive/2007/08/01/839490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值