📄 课程设计 马的遍历.cpp
字号:
# include < iostream.h >
# include < iomanip.h >
# include < time.h >
# include < stdlib.h >
# include < fstream.h >
bool mai ( int , int );
void main ( ) {
int m,n;
cout<<"the first position(m,n):";
cin>>m>>n;
int a=m-1 ;
while ( a <m ) {
int b = n-1;
while ( b <n)
if ( mai ( a , b ) )
b++;
a++;
}
cout << "从第1位置到第90位置格全部走完了!!!" << endl;
}
/////////////////////////////////////////////////////////////////
bool mai ( int row , int column ) {
int Zao ( int [ ] );
void print ( int [ ] [ 10 ] , int , int , int , int );
int x = 1;
static xx = 0;
int board [ 9] [ 10] = { 0 } ; // 棋盘
int CurrentRow = row; // 骑士初始位置,行
int CurrentColumn = column; // 骑士初始位置,列
board [ CurrentRow ] [ CurrentColumn ] = 1; // 走过的标记
int horizontal [ 8 ]; // 列
int vertical [ 8 ]; // 行
horizontal [ 0 ] = 2; // 8种移动方式之列
horizontal [ 1 ] = 1;
horizontal [ 2 ] = -1;
horizontal [ 3 ] = -2;
horizontal [ 4 ] = -2;
horizontal [ 5 ] = -1;
horizontal [ 6 ] = 1;
horizontal [ 7 ] = 2;
vertical [ 0 ] = -1; // 8种移动方式之行
vertical [ 1 ] = -2;
vertical [ 2 ] = -2;
vertical [ 3 ] = -1;
vertical [ 4 ] = 1;
vertical [ 5 ] = 2;
vertical [ 6 ] = 2;
vertical [ 7 ] = 1;
int accessibility [ 9 ] [ 10] = {
{ 2,3,4,4,4,4,4,4,3,2 } ,
{ 3,4,6,6,6,6,6,6,4,3 } ,
{ 4,6,8,8,8,8,8,8,6,4 } ,
{ 4,6,8,8,8,8,8,8,6,4 } ,
{ 4,6,8,8,8,8,8,8,6,4 } ,
{ 4,6,8,8,8,8,8,8,6,4 } ,
{ 4,6,8,8,8,8,8,8,6,4 } ,
{ 3,4,6,6,6,6,6,6,4,3 } ,
{ 2,3,4,4,4,4,4,4,3,2 } ,
}; // 棋盘相应点的难易值
int k = 1;
while ( x ) {
int nan [ 8 ] = { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 }; // 保存难易值
for ( int moveNumber = 0; moveNumber < 8; moveNumber++ )
if ( CurrentRow + vertical [ moveNumber ] >= 0 && // 检查行,列,是否走过
CurrentRow + vertical [ moveNumber ] < 9 &&
CurrentColumn + horizontal [ moveNumber ] >= 0 &&
CurrentColumn + horizontal [ moveNumber ] < 10 &&
board [ CurrentRow + vertical [ moveNumber ] ]
[ CurrentColumn + horizontal [ moveNumber ] ] == 0 )
nan [ moveNumber ] = accessibility [ CurrentRow + vertical [ moveNumber ] ]
[ CurrentColumn + horizontal [ moveNumber ] ];// 难易值
int moveNumber1; // 最难走的移动方式
moveNumber1 = Zao ( nan );
if ( moveNumber1 == 9 ) {
if ( k == 90) {
x = 0;
print ( board , k , row , column , xx );
xx++;
return true;
}
else {
x = 0;
xx++;
return false;
}
}
else {
k++;
CurrentRow += vertical [ moveNumber1 ]; // 相应移动方式移动后行的变化
CurrentColumn += horizontal [ moveNumber1 ]; // 相应移动方式移动后列的变化
board [ CurrentRow ] [ CurrentColumn ] = k; // 走过的标记
}
}
}
/////////////////////找出最难走的//////////////////////
int Zao ( int nan [ ] ) {
int temp = 9;
for ( int i = 0; i < 8; i++ )
if ( temp > nan [ i ] && nan [ i ] != -1 )
temp = nan [ i ];
if ( temp != 9 ) {
int temp2 [ 8 ] = { 0 }; // 纪录满足条件的元素的下标
int t = 0; // 满足条件下标++
for ( int j = 0; j < 8; j++ )
if ( temp == nan [ j ] ) {
temp2 [ t ] = j + 1;
t++;
} // temp2中按顺序保存了nan中满足条件的元素的下标
int temp3 = 0; // 纪录满足条件的元素个数
for ( int jj = 0; jj < 8; jj++ )
if ( temp2 [ jj ] != 0 )
temp3++;
int temp4 = rand ( ) % temp3; // 随机选取满座条件的下标
temp = temp2 [ temp4 ] - 1;
}
return temp;
}
////////////////////输出走过的格子//////////////
void print ( int b [ ] [ 10] , int k , int r , int c , int xx ) {
cout << "初始位置是: 行 " << r + 1 << " 列 " << c + 1 << " 一共走了" << xx << "回" << endl;
for ( int x = 0; x < 10; x++ )
cout << " " << x + 1 << "列";
cout << endl;
for ( int i = 0; i < 9; i++ ) {
cout << i + 1 << "行";
for ( int j = 0; j <10; j++ ) {
cout << setw ( 4 ) << b [ i ] [ j ] << " ";
}
cout<< endl<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -