1) Cái code này của anh, em copy vào không chạy. Nó chỉ hiện màn hình đen và chữ “Press any key…”. Anh Rook chỉnh lại dùm.
Code:
#include<iostream>
using namespace std;
/* Knight Tour */
const int size = 8;
void initialization();
void print();
void Knight ( int times, int row, int col );
bool K[size][size];
bool check( int row, int col);
int move_col[] = {-2, -1, +1, +2, +2, +1, -1, -2};
int move_row[] = {+1, +2, +2, +1, -1, -2, -2, -1};
int row, col, index, next_row, next_col;
int times;
int main(){
initialization();
Knight (0,0,0);
return 0;
}
void initialization()
{
index =0;
times = 0;
row = 0;
col = 0;
for ( int i=0; i < size; i++)
{
for ( int j=0; j < size; j++)
{
K[i][j] = false;
}
}
K[row][col] = true;
}
bool check ( int row, int col )
{
if ( row > 7 || row < 0 || col > 7 || col < 0 || K[row][col] == true )
return false;
else
return true;
}
void print ()
{
index++;
cout << " Let's go Knight ^^" << endl;
cout << " The : "<< index << "th"<< endl;
for ( int k = 0; k < size; k++ )
{
for ( int m = 0; m < size; m++ )
{
if ( K[k][m] == true )
{
cout << " K " ;
}
else
cout << " * ";
}
cout << endl;
}
}
void Knight ( int times, int row, int col)
{
K[row][col] = true;
if ( times >= 63 )
{
print();
cin.get();
}
else
{
for ( int i = 0; i < 8; i++ )
{
next_col = col + move_col[i];
next_row = row + move_row[i];
if (check( next_row,next_col ))
{
Knight (times+1, next_row, next_col);
K[next_row][next_col] = false;
}
}
}
}
----------------------------------------------------------------------
2) Có cái code này chạy được (box giải thuật, trang dưới cùng, đã chỉnh sửa ^ ^).
3) Nhưng đọc hòai mà không hiểu tại sao khi times bằng 63 lần thì in ra, nhưng in ra thì kết thúc chứ sao lại in được tiếp lần 2? Vì sau câu lệnh if – else đó thì không còn lời gọi hàm nào khác ngòai câu “K[cRow][cCol] = 0”.
4) Còn 1 vấn đề nữa là, khi xem cái "index 1th" trong chương trình(màn hình đen).
int horizontal[] = {-2, -1, +1, +2, +2, +1, -1, -2};
int vertical[] = {+1, +2, +2, +1, -1, -2, -2, -1};
Cái nước thứ 37 sang 38 tại sao lại đi như vậy? Nếu theo quy tắc từ 0 đến 7 như trên thì nó phải đi đến ô 40 chứ? Nghĩa là nó đã đi đến ô 40, rồi có chuyện gì đó nên nó đã rút lại nước đó, chuyển sang ô phía trên?
Code:
#include<iostream>
#include<iomanip>
#include<conio.h>
using std::cout;
using std::endl;
using std::setw;
using std::cin;
const int size = 8;
void initialization();
void print();
void Knight ( int times, int cRow, int cCol );
int K[size][size];
int check( int nextRow, int nextCol);
int horizontal[] = {-2, -1, +1, +2, +2, +1, -1, -2};
int vertical[] = {+1, +2, +2, +1, -1, -2, -2, -1};
int index;
void main()
{
initialization();
Knight (0,0,0);
//getch();
}
void initialization()
{
for ( int i=0; i < size; i++)
{
for ( int j=0; j < size; j++)
{
K[i][j] = 0;
}
}
}
int check ( int nextRow, int nextCol )
{
if ( nextRow > 7 || nextRow < 0 || nextCol > 7 || nextCol < 0 || K[nextRow][nextCol] != 0 )
return 0;
return 1;
}
void print()
{
index++;
cout << " Let's go Knight ^^" << endl;
cout << " The : "<< index << "th"<< endl;
for ( int i = 0; i < size; i++ )
{
for ( int j = 0; j < size; j++ )
{
cout << setw(3) << K[i][j] ;
}
cout << endl << endl;
}
}
void Knight ( int times, int cRow, int cCol)
{
int nextRow, nextCol;
K[cRow][cCol] = times + 1;
if ( times >=63 )
{
cout << "-----------------------" << endl;
print();
getch();
}
else
{
for ( int i = 0; i < 8; i++ )
{
nextCol = cCol + horizontal[i];
nextRow = cRow + vertical[i];
if (check(nextRow, nextCol))
{
Knight (times+1, nextRow, nextCol);
}
}
}
K[cRow][cCol] = 0;
}