在n*m的棋盘中,马只能走“日” 字。马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次。找出所有路径。
×××××××××××××
类似问题:
在半个中国象棋棋盘上,马在左下角(1,1)处,马走日字…而且只能往右走…不能向左…可上可下…求从起点到(m, n)处有几种不同的走法。
八皇后。
×××××××××××××
预备知识---》图的深度优先:
https://www.cnblogs.com/OctoptusLian/p/8260173.html
参考代码1:
https://blog.csdn.net/skylv111/article/details/38930213
参考代码2(优先):
https://blog.csdn.net/qq_35654259/article/details/80644714
参考思考(图例):
https://blog.csdn.net/crayondeng/article/details/17174951
#include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; #define max 101 int count = 0; int m,n;//棋盘大小 int start_x,start_y;//起点位置 //考虑到马有8种走法 int dx[8]={-2,-1,1,2,-2,-1,2,1}; int dy[8]={-1,-2,-2,-1,1,2,1,2}; int board[max][max]={0}; //输出棋盘 void show(int m,int n){ for(int i = 0;i<m;i++){ for(int j = 0;j<n;j++){ cout<<board[i][j]<<" "; } cout<<endl; } } //判断下一步是否是起始的位置 int next_move(int x,int y){ for(int i = 0;i<8;i++){ if(board[x+dx[i]][y+dy[i]] == 1){//1表示马的起始位置 return 1; } } return 0; } //判断是否填了 int finish(int x,int y){ if(board[x][y] == 0){//0表示马没有走过 非0表示马已经走过 return 1; } return 0; } //马的下一步走法已经超出棋盘的范围了 int judge(int x,int y,int m,int n){ if(x>=0&&x<m&&y>=0&&y<n){ return 1; } return 0; } //马走的函数 void move(int x,int y,int num){ if(num == m*n+1&&next_move(x,y)){ cout<<++count<<endl; show(m,n);//输出棋盘 cout<<endl; return ; }else{ for(int i = 0;i<8;i++){ if(finish(x+dx[i],y+dy[i])&&judge(x+dx[i],y+dy[i],m,n)){//若不符合上述条件就表示马放弃之后会走这一步了 board[x+dx[i]][y+dy[i]] = num;//在棋盘上记录马的步数 move(x+dx[i],y+dy[i],num+1); board[x+dx[i]][y+dy[i]] = 0;//当遍历完棋盘后将棋盘重新置为0(表示马为走过) (不过开始位置还是1这里读者慢慢体会) } } } } int main(){ cout<<"请输入格子数"<<endl; cin>>m>>n; cout<<"请输入起始的位置"<<endl; cin>>start_x>>start_y; int number = 1; board[start_x][start_y] = number;//将起始位置为1 move(start_x,start_y,number+1); cout<<count; }
//上面的如果还理解不了,可以看这个。
#include <stdio.h>
#include <string.h> int matrix[10][9]; int journey = 1; int step_x[]={1,2,2,1,-1,-2,-2,-1},step_y[]={2,1,-1,-2,-2,-1,1,2}; void outMatrix(){ int i,j; for (i=0;i<10;i++) { for (j=0;j<9;j++) { printf("%-2d ",matrix[i][j]); } printf("\n"); } } bool outofbounds(int x,int y){ return x < 0 || y < 0 || x >= 10 || y >= 9; } bool isCome(int x,int y){ return matrix[x][y]; } void gotoend(int x, int y ){ if(journey>90) return; int i; matrix[x][y]=journey++; //当前是第几步 for (i = 0;i<8;i++) { int next_x = x+step_x[i]; int next_y = y+step_y[i]; if(!outofbounds(next_x,next_y) && !matrix[next_x][next_y]){ gotoend(next_x,next_y); } } } int main(){ int start_x,start_y; int i; scanf("%d%d",&start_x,&start_y); for (i = 0;i<10;i++) { memset(matrix[i],0,sizeof(matrix[0])); } gotoend(start_x,start_y); outMatrix(); return 0; }
原文:https://www.cnblogs.com/paprikatree/p/10530075.html