题目描述

描述

马在中国象棋以日字形规则移动。请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入

第一行为整数T(T < 10),表示测试数据组数。
每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0<=x<=n-1,0<=y<=m-1, m < 10, n < 10)

输出

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

样例输入

1

54 0 0

样例输出

32

题目分析

这是一道十分典型的DFS题,是迷宫的“进化版”。迷宫是往上下左右四个方向行走,同理本题即为往八个方向行走(如图2-1【我已经尽力画了。。】)

设红色坐标为[x,y],这从1-8的坐标依次是[x-1,y+2][x-2,y+1][x-2,y-1][x-1,y-2][x+1,y-2][x+2,y-1][x+2,y+1][x+1,y+2],同理,将其依次存入x[8],y[8]里。

DFS条件判断:不超出边界,不走“回头路”。

DFS退出条件:将整个棋盘摆满即摆放总个数==行*列

代码实现

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int n,r,i,j,k,y1,y2,q,w,sn=0;

bool b[105][105];

intx[8]={-2,-1,1,2,2,1,-1,-2},y[8]={1,2,2,1,-1,-2,-2,-1};//存储路径

bool chek(int a,int b)//判断是否超出边界函数

{

if(a<=r-1&&b<=w-1&&a>=0&&b>=0)return1;

return0;

}

void s(int str,int stw,int n)

{

if(n==r*w){sn++;return;}//判断是否已摆满

for(inti=0;i<=7;i++)

{

if((!b[str+x[i]][stw+y[i]])&&chek(str+x[i],stw+y[i]))

{

b[str+x[i]][stw+y[i]]=1;

s(str+x[i],stw+y[i],n+1);

b[str+x[i]][stw+y[i]]=0;//回溯

}

}

}

int main()

{

intx1,x2;

scanf("%d",&n);

for(i=1;i<=n;i++)

{

sn=0;

scanf("%d%d%d%d",&r,&w,&x1,&x2);

b[x1][x2]=1;

s(x1,x2,1);

printf("%d\n",sn);

memset(b,0,sizeof(b));//一定要记住清零

}

}

后记

本人第一次写博客,请多指教^_^。

Writing by Panda Hu 2017.5.20

[openjudge-搜索]深度优先搜索之马走日的更多相关文章

  1. Problem L: 搜索基础之马走日

    Problem L: 搜索基础之马走日 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 134  Solved: 91[Submit][Status][W ...

  2. noi 8465 马走日

    8465:马走日 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  1024kB 描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y ...

  3. 小米 oj 马走日 (bfs 或 双向bfs)

     马走日 序号:#56难度:困难时间限制:1500ms内存限制:10M 描述 在中国象棋中,马只能走日字型.现在给出一个由 N*M 个格子组成的中国象棋棋盘( 有(N+1)*(M+1)个交叉点可以落子 ...

  4. T1219:马走日

    [题目描述] 马在中国象棋以日字形规则移动. 请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. [输入] 第 ...

  5. 马走日的解法(dfs)

    马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. Input 第一行为整数T ...

  6. 【算法】深度优先 马走日 Hamilton routes

    在n*m的棋盘中,马只能走“日” 字.马从位置(x,y)处出发,把棋盘的每一格都走一次,且只走一次.找出所有路径. ××××××××××××× 类似问题: 在半个中国象棋棋盘上,马在左下角(1,1)处 ...

  7. 挑战程序2.1.4 穷竭搜索>>深度优先搜索

      深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386  思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 ...

  8. 搜索——深度优先搜索(DFS)

    设想我们现在身处一个巨大的迷宫中,我们只能自己想办法走出去,下面是一种看上去很盲目但实际上会很有效的方法. 以当前所在位置为起点,沿着一条路向前走,当碰到岔道口时,选择其中一个岔路前进.如果选择的这个 ...

  9. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  10. Knight's Trip---hdu3766(马走日求最小走的步数)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3766 给你一个x ,y 求出从(0,0)位置到达需要的最小步数每次只能走日型: 下图为暴力bfs得到的 ...

随机推荐

  1. 20165336 实验一 Java开发环境的熟悉

    20165336 实验一 Java开发环境的熟悉 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:康志强 学号:20165336 指导教师:娄嘉鹏 实验日期:2018年4月2日 实验 ...

  2. Android SDK下载和更新失败的如何解决

    一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...

  3. 【PyQt5-Qt Designer】QSlider滑块

    QSlider滑块 QSlider简介 QSlider小部件提供了一个垂直或水平滑块. 滑块是控制有界值的经典控件.它允许用户沿水平或垂直凹槽移动滑块手柄,并将手柄的位置转换为合法范围内的整数值. Q ...

  4. python基于django编写api+前端后端分离

    有用 https://segmentfault.com/a/1190000016049962#articleHeader2 python的前后端分离(一):django+原生js实现get请求 htt ...

  5. lsof 命令

    [root@localhost ~]# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init root cwd DIR , / in ...

  6. Scala数据类型的继承结构

    Scala中,所有的值都是类对象,而所有的类,包括值类型,都最终继承自一个统一的根类型Any.统一类型,是Scala的又一大特点.更特别的是,Scala中还定义了几个底层类(Bottom Class) ...

  7. 【Java】-NO.13.Java.1.Foundation.1.001-【Java IO】-

    1.0.0 Summary Tittle:[Java]-NO.13.Java.1.Foundation.1.001-[Java IO]- Style:Java Series:Foundation Si ...

  8. one-hot句子向量 对比度增强

    one-hot映射时,如何选取TOPN作为每一个词承载的word2vec的信息? 我们已经知道,对于这种例子: 怎么绑定手机号? 怎么关联手机号? 他们的相似度取决于绑定和关联这两个词如何相似. #取 ...

  9. sendmail 发送邮件 zabbix 自定义报警

    配合zabbix 触发脚本 达到自定义报警目的 #!/bin/bash # Created : 2015.12.08 # Updated : 2015.12.08 # Author : sanmuya ...

  10. 【LeetCode每天一题】Divide Two Integers(两整数相除)

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...