回溯5--马的遍历

回溯5--马的遍历

一、心得

二、题目及分析

三、代码及结果

 1 /*
 2 马的遍历
 3 不用回头
 4
 5 */
 6 #include <iostream>
 7 using namespace std;
 8
 9 int ans[100][2];
10 int total=0;
11
12 bool vis[100][100];
13 //row colum
14 int horseRoad[5][2]={{0,0},{2,1},{1,2},{-1,2},{-2,1}};
15
16 void print(int k){
17     total++;
18     cout<<total<<": "<<endl;
19     cout<<"("<<0<<","<<0<<")"<<" ";
20     for(int i=1;i<=k;i++){
21         cout<<"("<<ans[i][0]<<","<<ans[i][1]<<")"<<" ";
22     }
23     cout<<endl;
24 }
25
26 void search(int r,int c,int k){
27     if(vis[4][8]==1) print(k-1);
28     else
29         for(int i=1;i<=4;i++){
30             int r1=r+horseRoad[i][0];
31             int c1=c+horseRoad[i][1];
32             if(r1>=0&&r1<=4&&c1>=0&&c1<=8){
33                 ans[k][0]=r1;
34                 ans[k][1]=c1;
35                 vis[r1][c1]=1;
36                 search(r1,c1,k+1);
37                 vis[r1][c1]=0;
38             }
39         }
40
41 }
42
43 int main(){
44     search(0,0,1);
45     cout<<total<<endl;
46     return 0;
47 } 

时间: 2024-10-22 22:16:37

回溯5--马的遍历的相关文章

马的遍历问题

题意例如以下: 马的遍历问题.设计程序完毕例如以下要求: 在中国象棋棋盘上,对任一位置上放置的一个"马". 均能选择一个合适的路线,使得该棋子能按象棋的规则 不反复地走过棋盘上的每一位置. 思路:这是一个DFS搜索,然后没有使用另外的数组来标记某一位置是否已经被走过,而是直接使用存步数的数组num[][]来作为标记数组! 然后我使用了两个数组作为方向坐标,以便能让马移动,同一时候也能记录马所在位置的坐标!(马是能够从8个移动方向中选择的!) 代码还是非常好理解的! 至于棋盘的规格能够自

回溯8--跳马问题

回溯8--跳马问题 一.心得 二.题目及分析 三.代码及结果 1 /* 2 一边默认一个顺序,另外一边出要求 3 选书:默认按照人一个个来,选书的话就一本本选就好了 4 */ 5 #include <iostream> 6 using namespace std; 7 8 //标志数组 9 int vis[6][6]; 10 //结果数组 11 int ans[6][6]; 12 int horseRoad[9][2]={{0,0},{2,1},{1,2},{-1,2},{-2,1},{-2,

P1443 马的遍历

P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 #include<iostream> #include<cstdio>

马的遍历

题目链接 首先,这是一道水题.(虽然我提交了四次才A掉) 思路是很简单的.马的遍历,经典中的经典,一想就是搜索.但流传较广的是DFS,第一直觉也是DFS.可是,一看题,求马到各点的最短路,是求最优解,且是各个点,自然想到了BFS. BFS的简单思路,将矩阵每个点 原文地址:https://www.cnblogs.com/qing1/p/11066106.html

马的遍历——搜索与回溯

题目描述 Description 中国象棋半张棋盘如图所示.马自左下角往右上角跳.今规定只许往右跳,不许往左跳.比如图4(a)中所示为一种跳行路线,并将所经路线打印出来. 输入输出格式 Input/output 输入格式:无输出格式: 第一行:一个整数total表示第几种跳法 第二行:0,0-->2,1-->3,3-->1,4-->3,5-->2,7-->4,8 输入输出样例 Sample input/output 样例测试点#1 输入样例: 无 输出样例: 1 0,0

Ka的回溯编程练习 Part3|马的遍历

1 #include <stdio.h> 2 int board[100][3]={0},totally=0; 3 int x[4]={2,1,-1,-2},y[4]={1,2,2,1}; 4 void o(int k) //这个输出函数需要借助回溯中n的值来完成输出 5 { 6 totally++; 7 printf("%d:",totally); 8 int r; 9 for(r=1;r<=k-1;r++) 10 printf("|%d,%d|->

Ka的回溯编程练习 Part5|跳马,又名马的遍历2

1 #include <stdio.h> 2 int TheEarthLand[6][6]={0}; 3 int HowToGoX[]={0,1,2,2,1,-1,-2,-2,-1}; 4 int HowToGoY[]={0,-2,-1,1,2,2,1,-1,-2}; 5 int total=0; 6 void op() 7 { 8 total++; 9 printf("<Way%d>:\n",total); 10 int i,j; 11 for(i=1;i&l

关于回溯与马

这道题目呢,舞台被设定在被熊孩子撕剩的半边中国象棋棋盘上. 有一匹老马,老到只能往右跳,从半张棋盘的一个角跳到对角线上的另一个点(如图a),要求输出所有可能的路线,用坐标表示. 这个题目就非常地适合用回溯算法来解释了,类似于走迷宫,不能越界,所以我们可以得到它所有可能前进的方向(如图b).这题目的坐标有些特别,横坐标表示的是行数(即图a中的黑色坐标),与我们平时看惯了的坐标轴不一样,所以解题时要稍微注意一下.如果不能到达终点,则返回一步,尝试另一个方向.题目很简单,先不多说别的,奉上代码如下:

【Algorithm】回溯法与深度优先遍历的异同

1.相同点: 回溯法在实现上也是遵循深度优先的,即一步一步往前探索,而不像广度优先那样,由近及远一片一片地扫. 2.不同点 (1)访问序 深度优先遍历: 目的是“遍历”,本质是无序的.也就是说访问次序不重要,重要的是都被访问过了. 可以参见题Surrounded Regions,深度优先只需要把从边界起始的'O'全部访问到即可. 因此在实现上,只需要对于每个位置记录是否被visited就足够了. 回溯法: 目的是“求解过程”,本质是有序的.也就是说必须每一步都是要求的次序. 可以参见题Word

洛谷 P1443 马的遍历

题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出格式: 一个n*m的矩阵,代表马到达某个点最少要走几步(左对齐,宽5格,不能到达则输出-1) 输入输出样例 输入样例#1: 3 3 1 1 输出样例#1: 0 3 2 3 -1 1 2 1 4 代碼實現: #include<cstdio>#include<iostream>using