马的遍历问题

在n*m的棋盘中,马只能走“日” 字。马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次。找出所有路径。

问题解的搜索空间?

棋盘的规模是n*m,是指行有n条边,列有m条边。

马在棋盘的点上走,所以搜索空间是整个棋盘上的n*m个点。

用n*m的二维数组记录马行走的过程,初值为0表示未经过。

在寻找路径过程中,活结点的扩展规则?

对于棋盘上任意一点A(x,y),有八个扩展方向:

A(x+1,y+2),A(x+2,y+1)

A(x+2,y-1),A(x+1,y-2)

A(x-1,y-2),A(x-2,y-1)

A(x-2,y+1),A(x-1,y+2)

为构造循环体,用数组fx[8]={1,2,2,1,-1,-2,-2,-1},fy[8]= {2,1,-1,-2,-2,-1,1,2}来模拟马走“日”时下标的变化过程。
 
扩展的约束条件

不出边界;

每个点只经过一次。

棋盘点对应的数组元素初值为0,对走过的棋盘点的值置为所走步数,起点存储“1”,终点存储“n*m”。

函数check,检查当前状态是否合理
 
输入
0 0

输出
1  90 82 75 88 83 78 85 89
71 74 2 64 81 76 87 84 79
44 55 72 69 3 63 80 77 86
73 70 45 56 65 68 4 62 59
54 43 66 51 46 57 60 49 5
41 37 53 31 67 50 47 58 61
35 12 42 38 52 30 25 6 48
20 39 36 13 32 23 16 29 26
11 34 21 18 9 14 27 24 7
40 19 10 33 22 17 8 15 28
 
#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;
}

马的遍历问题-回溯法应用-ACM的更多相关文章

  1. 洛谷 P1443 马的遍历

    P1443 马的遍历 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘 ...

  2. leetcode 236. 二叉树的最近公共祖先LCA(后序遍历,回溯)

    LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先. 题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百 ...

  3. 最少步数&P1443 马的遍历

      1330:[例8.3]最少步数 s数组:记录(1,1)到达每一点需要的最少步数 s[1][1]自然为 0,其余初始化为 -1 que数组:que[#][1] 表示(1,1)可到达点的 x 坐标 q ...

  4. 【bfs】洛谷 P1443 马的遍历

    题目:P1443 马的遍历 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 记录一下第一道ac的bfs,原理是利用队列queue记录下一层的所有点,然后一层一层遍历: 其中: 1.p ...

  5. 马的遍历 洛谷 p1443

    题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输出 ...

  6. 洛谷P1443 马的遍历

    https://www.luogu.org/problemnew/show/P1443 很经典的搜索题了,蒟蒻用广搜打的 不说了,上代码! #include<bits/stdc++.h> ...

  7. [luoguP1443]马的遍历

    首先来看一下题目描述: 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋 ...

  8. 【洛谷】P1443 马的遍历

    题目:https://www.luogu.org/problemnew/show/P1443 简单的BFS模板题——因为我写出来了. 分析过程: n*m矩阵,用二维数组 数据不大,二维数组稳了 先把二 ...

  9. 【洛谷P1443 马的遍历】

    题目链接(%%%jyy大佬) 题目描述 有一个n*m的棋盘(1<n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数 ...

随机推荐

  1. JavaScript高级程序设计17.pdf

    导航和打开窗口 使用window.open()方法可以导航到一个特定的URL也可以打开一个新的浏览器窗口,接收4个参数:要加载的URL.窗口目标.特性字符串和一个表示新页面是否取代浏览器历史记录中当前 ...

  2. 【protobuf进阶】通过.proto文件导出C#支持的.cs类文件

    protobuf是一个跨平台的消息交互协议,类似xml.json等. protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.google 提供了多 ...

  3. BZOJ 1878 SDOI 2009 HH项链 树状数组 + 脱机处理

    标题效果:一些珠子项链.珠具有不同的颜色.我们问了很多次有多少种不同的颜色有过一段范围. 思考:这个问题让我学会聪明的离线实践.按左端点排序问题.加工出来的位置每种颜色首次出现.每一种颜色的下一次出现 ...

  4. android 15 activity跳转

    从一个屏幕跳到另一个屏幕,一个activity跳转到另一个activity,Intent类用于组件之间传递数据和跳转,组件包括不仅activity. package com.sxt.day04_01; ...

  5. linux ----Inode的结构图

    http://www.ruanyifeng.com/blog/2011/12/inode.html 先看看Inode的结构图             再来了解一下文件系统如何存取文件的 1.根据文件名 ...

  6. UNIX环境高级编程第二版代码笔记

    1. 第一个程序 gcc 1.1.c  /tmp/ccbnJqcB.o: In function `main': 1.1.c:(.text+0x17): undefined reference to ...

  7. iOS-iPad开发之popoverController使用介绍

    iOS-iPad开发之popoverController使用介绍 iOS开发UI篇-popoverController使用注意 iOS SDK:自定义Popover(弹出窗口) 实现的简单例子: // ...

  8. Java基础知识强化08:将字符串倒序输出(包括空格)的几种方法

    1.最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了: package himi.hebao05; public class TestDemo02 { pub ...

  9. html、body、document、window的区别

    html是一门超文本标记语言: document对象代表整个html文档,可用来访问页面中的所有元素: body代表document的主体子对象,除浏览器头部,页面中能够看到的内容都属于body中的内 ...

  10. sql 减去分钟

    SQL SERVER:SELECT DATEADD( minute,-10,GETDATE()) ORACLE:SELECT to_char(sysdate -interval '10' minute ...