1337: 【作】【提高】马的遍历

内存限制:16 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:2 解决:2

题目描述

中国象棋半张棋盘如图(a)所示。马自左下角往右上角跳。

今规定只许往右跳,不许往左跳,且要求马跳的方式按照(b)图顺时针深度优先递归。

比如图(a)中所示为一种跳行路线。

如果马要从0,0点,跳到4,8点,前6种跳法的打印格式如下,请参考前6种跳的方式,输出马从0,0点到4,8点所有可能的跳的路线。

1:0,0->2,1->4,2->3,4->4,6->2,7->4,8
2:0,0->2,1->4,2->3,4->1,5->3,6->4,8
3:0,0->2,1->4,2->3,4->1,5->2,7->4,8
4:0,0->2,1->4,2->2,3->4,4->3,6->4,8
5:0,0->2,1->4,2->2,3->4,4->2,5->4,6->2,7->4,8
6:0,0->2,1->4,2->2,3->4,4->2,5->0,6->2,7->4,8


输入

输出

按要求输出路径

样例输入 复制


样例输出 复制


提示

#include <bits/stdc++.h>
using namespace std;

int a[100][100],t=0; //路径总数和路径                  
int dx[4]={2,1,-1,-2},dy[4]={1,2,2,1}; //四种移动规则
void print(int n) //输出结果
{
    t++;
    cout<<t<<":";
	for(int i=1;i<n;i++){
		cout<<a[i][1]<<","<<a[i][2]<<"->";	
	}
	cout<<"4,8"<<endl;
}
void dfs(int k) //递归回溯
{
	for (int i=0;i<=3;i++){ //往4个方向跳
	    int tx=a[k-1][1]+dx[i],ty=a[k-1][2]+dy[i];
		if (tx>=0&&tx<=4 &&ty>=0&&ty<=8){ //判断马不越界
			a[k][1]=tx; //保存当前马的位置                               
			a[k][2]=ty;
			if (tx==4&&ty==8){
				print(k);
			}else{
				dfs(k+1); //搜索下一步	
			} 
		}
	} 
}
int main(){
	a[1][1]=0;
	a[1][2]=0;
	dfs(2); //从坐标(0,0)开始往右跳第二步
}