caioj1039:递归9(骑士巡游)

【闲话】

昨天讲过 然后感觉比较好写 自己写了之后检查呀改呀觉得没毛病就是没有输出 写了老师的程序才发现自己考虑掉了情况 然鹅自以为考虑完全了 不过可以修改自己的程序的感觉比以前只能记住老师程序的感觉棒太多哈哈哈

主要问题是我以为if(a[x2][y2]==-1])已经把越界的都否定完了然鹅这么写并不包含x2<1以及y2<1的时候 长记性长记性 以及我那样写比较麻烦还要把数组初始化啥的

【题意】
输入 n ( 1< = n < = 10 ) 代表棋盘的规模就是 n*n 的规模,
骑士永远从 (1,1) 出发。
输出骑士的走法(遍历棋盘的所有格子)
【输入格式】
一行一个整数n
【输出格式】
按照
int dx[8]={-2,-1,-2,1,2,2,1,-1};
int dy[8]={-1,2,1,2,1,-1,-2,-2};
的顺序,输出第一种遍历的走法。
如果没有解,输入”-1″

【样例输入】
5
【样例输出】
1 10 5 18 3
14 19 2 11 6
9 22 13 4 17
20 15 24 7 12
23 8 21 16 25

【代码1】老师的

#include<cstdio>
using namespace std;
int dx[8]={-2,-1,-2,1,2,2,1,-1};
int dy[8]={-1,2,1,2,1,-1,-2,-2};
int n,a[20][20];
bool flag;

void dfs(int x,int y,int k){
	if(flag) return;//只需输出第一种遍历的方法 
	if(k>n*n){
		for(int i=1;i<=n;i++){
		  for(int j=1;j<=n;j++)
		    j<n?printf("%d ",a[i][j]):printf("%d\n",a[i][j]);
		flag=true;
		}
		return;
	}
	for(int i=0;i<8;i++){
	int x2=x+dx[i],y2=y+dy[i];
		if(x2<1||x2>n||y2<1||y2>n) continue;//越界
		if(!a[x2][y2]){
			a[x2][y2]=k;
			dfs(x2,y2,k+1);
			a[x2][y2]=0;//不写 就还原 a数组用来做判断(八皇后可以不加0 没有用a[][]做判断 
		}
	}
}
int main(){
	scanf("%d",&n);
    a[1][1]=1; 
	dfs(1,1,2);//a[1][1]是第一个 后面从第2个开始
	if(!flag) printf("-1\n");
	return 0;
}

【代码2】自己写的

#include<cstdio>
#include<cstring>
using namespace std;
int dx[8]={-2,-1,-2,1,2,2,1,-1};
int dy[8]={-1,2,1,2,1,-1,-2,-2};
int n,a[20][20];
bool flag;

void dfs(int x,int y,int k){
	if(flag) return;
	if(k==n*n+1){
		for(int i=1;i<=n;i++){
		  for(int j=1;j<=n;j++)
		    j<n?printf("%d ",a[i][j]):printf("%d\n",a[i][j]);
		flag=true;
		}
		return;
	}
	for(int i=0;i<8;i++){
	int x2=x+dx[i],y2=y+dy[i];
	//if(x2<1||x2>n||y2<1||y2>n) continue;
		if(x2<1||y2<1||a[x2][y2]==-1) continue;
		if(!a[x2][y2]){
			a[x2][y2]=k;
			dfs(x2,y2,k+1);
			a[x2][y2]=0;
		}
	}
}
int main(){
	scanf("%d",&n);
	memset(a,-1,sizeof(a));
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
 	     a[i][j]=0;
    a[1][1]=1; 
	dfs(1,1,2);
	if(!flag) printf("-1\n");
	return 0;
}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/qq_39402039/article/details/77651677
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞