C++ 骑士遍历问题(编程算法)

题目描述
设有一个n*n的棋盘(n<=7),在棋盘上的任一点a(x,y)有一个中国象棋的马,按马走日字的规则,试找出一条路径,使马不重复地走遍棋盘上的每一个点.

按这个路径走:

{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,-2},{-2,-1}
输入
第一行n,第二行两个数,表示马的起始位置。
输出
n * n 的矩阵 左对齐,每个元素占4位,中间没有空格 没答案要输出-1
样例
输入:
5
1 1
输出:
1 14 19 8 25
6 9 2 13 18
15 20 7 24 3
10 5 22 17 12
21 16 11 4 23
提示

参考代码

#include<bits/stdc++.h>
using namespace std;
int n;
int x,y;
int vis[10][10];
int a[10][10];
int dir[8][2]={{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,-2},{-2,-1}};
void dfs(int z,int x,int y){
	if(z==n*n){
		for(int i=1; i<=n; i++){
			for(int j=1; j<=n; j++){
				printf("%-4d",a[i][j]+1);
			}
			cout << endl;
		}
		exit(0);
		return ;
	}
	for(int i=0; i<=7; i++){
		if(x+dir[i][0]>=1&&x+dir[i][0]<=n){
			if(y+dir[i][1]>=1&&y+dir[i][1]<=n){
				if(vis[x+dir[i][0]][y+dir[i][1]]==false){
					vis[x+dir[i][0]][y+dir[i][1]]=true;
					a[x+dir[i][0]][y+dir[i][1]]=z; 
					dfs(z+1,x+dir[i][0],y+dir[i][1]);
					vis[x+dir[i][0]][y+dir[i][1]]=false;
				}
			}
		}
	}
}
int main(){
	cin >>n;
	cin >>x >>y;
	vis[x][y]=true;
	dfs(1,x,y);
	cout <<"-1" << endl;
	return 0; 
}
  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值