⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 课程设计 马的遍历.cpp

📁 这是有关分酒问题
💻 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 + -