此为蒟蒻的第一篇博客,dalao勿喷,谢谢包容
骑士游历1
题目
如下图所示有m*n(n,m<=15)一个棋盘,在棋盘左下角的A(1,1)点,有一个中国象棋〈马〉,并约定马走的规则:
①走日字;②只能向右走。找出从A点(1,1)到B点(n,m)的路径条数。

输入
输入n和m,表示棋盘的大小。
输出
只有一个数,输出从A点到B点的路径条数。
样例输入
9 8
样例输出
10
解题思路
这道题可以用深搜,因为题目中写到〈马〉只能向右走,所以一共只有四个方向可以走,我们可以设置两个数组来定义方向
const int dx[5]={0,1,2,-1,-2};
const int dy[5]={0,2,1,2,1};
写这么个东西主要是因为想不到别的了
程序如下
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<iomanip>
const int maxn=20;//便于调试
const int dx[5]={0,1,2,-1,-2};//定义方向的两个数组
const int dy[5]={0,2,1,2,1};
int a[maxn+2][maxn+2],n,m,s=0;
using namespace std;
void dfs(int x,int y)
{
if(x==n&&y==m)//到达终点
{
s++;//路径数加一
return;
}
for(int i=1;i<=4;i++)//四个方向
{
if(x+dx[i]>0&&x+dx[i]<=n&&y+dy[i]>0&&y+dy[i]<=m)//判断移动后是否会超过棋盘
if(a[x+dx[i]][y+dy[i]]==0)//判断这个点是否走过(感觉现在没什么用,但是骑士游历2里面会用到的!)
{
a[x+dx[i]][y+dy[i]]=1;//将此点的状态标记为“走过”
dfs(x+dx[i],y+dy[i]);//进行递归
a[x+dx[i]][y+dy[i]]=0;//回溯
}
}
}
int main()
{
cin>>n>>m;//行和列
a[1][1]=1;//将第一个点标记为走过
dfs(1,1);
cout<<s;
}
做题的时候懵逼了好久
不过终于敲完了
198



被折叠的 条评论
为什么被折叠?



