马拦过河卒

Time Limit: 3000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

Input

一行四个数据,用空格分隔,分别表示B点的坐标和马的坐标。

Output

一个数据,表示所有的路径条数。

Sample Input

6 6 3 3

Sample Output

6

Hint

Source

代码实现:

这是我一开始做这道题时的代码:c语言代码,从书上看的基本上是照着打的,当时也不十分的理解

#include<stdio.h>
int main()
{int dx[9]={0,-2,-1,1,2,2,1,-1,-2};int dy[9]={0,1,2,2,1,-1,-2,-2,-1};int m ,  n , x, y,i , j ;long long int f[20][20]={0};int g[20][20]={0};scanf("%d %d %d %d",&n,&m,&x,&y);g[x][y]=1;for(i=1;i<=8;i++)if(x+dx[i]>=0&&x+dx[i]<=n&&y+dy[i]>=0&&y+dy[i]<=m)g[x+dx[i]][y+dy[i]]=1;for(i=1;i<=n;i++){if(g[i][0]!=1)f[i][0]=1;elsefor(;i<=n;i++){f[i][0]=0;}}for(j=1;j<=m;j++){if(g[0][j]!=1)f[0][j]=1;elsefor(;j<=m;j++)f[0][j]=0;}for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(g[i][j]==1)f[i][j]=0;elsef[i][j]=f[i-1][j]+f[i][j-1];}}printf("%lld\n",f[n][m]);return 0;
}/***************************************************
****************************************************/

下面是我后来再一次做这道题脱离了课本,自己理解着写出来的,当然是上面的代码给于的思想 代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main()
{int n , m , x , y ;int ma[9][2] ={0,0,1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1} ;//马可以走的地方int f[20][20] ; //用于记录路径int g[20][20] ; // 用于判断马的位置scanf("%d %d %d %d",&n,&m,&x,&y) ; //输入数据//初始化memset(f,0,sizeof(f))  ;memset(g,0,sizeof(g))  ;for(int i = 0 ; i<9 ; i++ ){int dx , dy  ;dx = x+ma[i][0] ;dy = y + ma[i][1] ;//防越界if(dx<0||dx>n||dy<0||dy>m)continue ;else g[dx][dy] = 1 ; //马的控制点}//第一列初始化for(int i=1 ; i <= n ; i++){if(!g[i][0])f[i][0] = 1 ;elsebreak ;}//第一行初始化for(int i = 1 ; i<= m ;i++){if(!g[0][i])f[0][i] =1 ;elsebreak;}//动态规划求路径for(int i=1 ; i<=n ; i++){for(int j = 1 ;j<=m;j++)//如果遇到马的控制点说明,此路不通,f[i][j]为0if(g[i][j]==1)f[i][j] = 0 ;//经分析可知到达f[i][j]的路径等于从上面的路径和从右面的路径之和elsef[i][j] = f[i-1][j] + f[i][j-1] ;}printf("%d\n",f[n][m]) ;return 0 ;
}/***************************************************
f[i][j]的取值如下:
0       1       1       1       1       1       1
1       2       0       1       0       1       2
1       0       0       1       1       0       2
1       1       1       0       1       1       3
1       0       1       1       2       0       3
1       1       0       1       0       0       3
1       2       2       3       3       3       6
f[i][j]的数值代表是到达该点的路径。
****************************************************/

现在对这道题的理解

现在学了DFS算法,决定用DFS算法再重新做一遍

代码如下:

#include<bits/stdc++.h>using namespace std;int mmp[100][100] ;//棋盘
int vis[100][100] ; //标记变量
int step  = 0 ; //记录路径数
int a ,b ,n , m ;
int next1[9][2]={0,0,-2,1,2,1,-2,-1,2,-1,1,2,1,-2,-1,-2,-1,2}; //马的走动方式void dfs(int x , int y)
{int i ;int next[2][2] = {{0,1},{1,0}} ; //卒的走动方式,卒无法向上走,也无法向右走int tx ,ty ;if(x==n&&y==m)step++ ;for(i=0;i<2;i++){tx = x + next[i][1] ;ty = y + next[i][0] ;if(tx<0 || tx>n || ty < 0 || ty > m)continue ;if(!vis[tx][ty]&&mmp[tx][ty]){vis[tx][ty] = 1 ;dfs(tx,ty)  ;vis[tx][ty] = 0 ;}}
}int main()
{int i ;cin>>n>>m>>a>>b ; //a,b是马的坐标。memset(vis,0,sizeof(vis)) ;memset(mmp,1,sizeof(mmp)) ; //先假设棋盘上没有马for(i=0;i<=8;i++){if(a+next1[i][0]>=0&&a+next1[i][0]<=n&&b+next1[i][1]>=0&&b+next1[i][1]<=m){mmp[a+next1[i][0]][b+next1[i][1]] = 0 ; //马的阻挡,卒无法通过。}}vis[0][0] = 1 ;dfs(0,0) ;cout<<step<<endl ;return 0 ;
}/*************************************
**************************************/

c语言版如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>int mmp[20][20] ;
int vis[20][20] ;
int step ;
int ma[9][2] ={0,0,1,2,1,-2,-1,2,-1,-2,2,1,2,-1,-2,1,-2,-1} ;
int n  , m ;
int b , c ;void dfs(int x , int y)
{if(x ==n&&y==m)step++ ;int next[2][2] = {1,0,0,1} ;int  i  ;int dx , dy ;for(i= 0 ; i<2 ;i++){dx = x + next[i][1] ;dy = y + next[i][0] ;if(dx<0||dx>n||dy<0||dy>m)continue ;if(!vis[dx][dy]&&mmp[dx][dy]==0){vis[dx][dy] = 1 ;dfs(dx,dy) ;vis[dx][dy] = 0 ;}}
}int main()
{int i ;int dx , dy ;scanf("%d %d %d %d",&n,&m,&b,&c) ;memset(vis,0,sizeof(vis)) ;memset(mmp,0,sizeof(mmp)) ;for(i = 0 ; i<= 8 ; i++){dx = b + ma[i][0] ;dy =  c + ma[i][1] ;if(dx<0||dx>n||dy<0||dy>m)continue ;elsemmp[dx][dy] = 1 ;;}vis[0][0] = 1 ;dfs(0,0) ;printf("%d\n",step) ;return 0 ;
}/***************************************************
****************************************************/

马拦过河卒(三种做法)相关推荐

  1. 王小二切饼、马拦过河卒

    1.王小二切饼 题目链接(点击) Problem Description 王小二自夸刀工不错,有人放一张大的煎饼在砧板上,问他:"饼不许离开砧板,切n(1<=n<=100)刀最多 ...

  2. 马拦过河卒(NOIP2002)

    马拦过河卒(NOIP2002) (2010-05-14 15:57:22) 标签: 递归 杂谈 分类: 递归与回溯 Description : 如图,A点有一个过河卒,需要走到目标B点.卒行走的规则: ...

  3. 马拦过河卒(C++)

    棋盘上 A点有一个过河卒,需要走到目标 B 点.卒行走的规则:可以向下.或者向右.同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过 ...

  4. 马栏过河卒动态规划算法

    题目 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上的某一点有一个对方的马(如C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点,如图中的C点和P1 ...

  5. C语言交换两个数字的三种做法

    C语言交换两个数字的三种做法 1.借助中间变量法: void swap(int *a , int *b) {int temp;temp = *a;*a = *b;*b = temp; } 2.使用加减 ...

  6. 最长递增字串的三种做法

    感谢博主:http://qiemengdao.iteye.com/blog/1660229 对于博主的第一种做法,最后还是要转到DP上来, 所以我觉得只是算是用求最大公共子序列的算法的强加应用,并没有 ...

  7. codevs 2924 数独挑战 x(三种做法+超详细注释~)

    2924 数独挑战  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond 题目描述 Description "芬兰数学家因卡拉,花费3个月时间设计出了世界 ...

  8. 不死兔子繁殖数学题的三种做法

    开发工具与关键技术:Java 撰写时间:2021/7/11 最近在学java遇到一个数学题 : 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死 ...

  9. 浅谈LCA问题(最近公共祖先)(三种做法)

    [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入格式 第一行包含三个正整数 N,M,SN,M,SN,M,S,分别表示树的结点个数.询问的个 ...

最新文章

  1. 空字符串计数、让字典可排序...Python冷知识(五)
  2. GitHub Copilot 支持 IntelliJ IDEA啦,插件装起来!
  3. android launcher主要功能_[Android] 自动收取蚂蚁森林能量
  4. 【c++】【转】c++中的explicit关键字
  5. Android USB Host与HID通讯
  6. JAVA面试题集收藏大放送
  7. android中间隔执行程序,Android:在SeekBar中设置间隔
  8. 在Visual Studio中一次运行两个项目
  9. JAVA设计模式-单例模式(Singleton)线程安全与效率
  10. JS设计模式——责任链模式
  11. 血液透析机最全学习手册
  12. 如何给抖音视频选择配乐?音乐是抖音作品重要的组成部分
  13. PCL--学习笔记(持续更新——蜗速)
  14. 关于Map线程安全的几种实现方案
  15. 【转载】没有urllib2怎么办?安装不了urllib2怎么办?
  16. Type-C扩展坞常用料号大全|音视频芯片|cc协议芯片|PD芯片|HUB芯片|网口芯片|音频芯片
  17. 腾讯云数据库产品介绍第四章-
  18. 项目经理不懂带人就自己累到死
  19. 软件实施工程师的工作
  20. ERP系统实施对企业内部控制的利弊分析

热门文章

  1. 是否需要读万卷书,行万里路
  2. 你的过去我来不及参与,你的未来我奉陪到底
  3. 安卓桌面软件_装bi小神器,让你的手机变成电脑桌面
  4. eNSP报40错误 Virtualbox启动设备失败 解决办法
  5. 电骡的E2K源创造程序
  6. Edraw Max试用感受
  7. 污水中的重金属去除工艺,吸附重金属树脂CH-90Na
  8. 运用Python的turtle库绘制等边三角形
  9. python turtle什么意思_python的turtle模块可以画什么
  10. 死于贫困交加的七位美国总统