/*题目 2577: 蓝桥杯2020年第十一届省赛真题-走方格
时间限制: 1Sec 内存限制: 128MB 提交: 681 解决: 409
题目描述
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n行第m 列。
只能向右或者向下走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
输入
输入一行n,m包含两个整数 。
输出
输出一个整数,表示答案。
样例输入
3 4
样例输出
2*/
#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int vis[30][30];//标记点是否走过 默认0
int a[30][30];
int n,m;
int dx[4]={0,1};
int dy[4]={1,0};
void dfs(int x,int y)
{
if(x==n-1&&y==m-1)
{
cnt++; //记录可以到点的方法数
return ;
}
for(int i=0;i<2;i++)
{
int tx=x+dx[i];
int ty=y+dy[i];
if((tx+1)%2==0&&(ty+1)%2==0) continue;//从0,0开始坐标要加一
if(vis[tx][ty]==0&&tx>=0&&tx<n&&ty>=0&&ty<m)
{
vis[tx][ty]=1;
dfs(tx,ty);
vis[tx][ty]=0;
}
}
}
int main()
{
cin>>n>>m;
vis[0][0]=1;
dfs(0,0);
cout<<cnt<<endl;
return 0;
}
//dfs模板
#include<bits/stdc++.h>
using namespace std;
int cnt=0;//计数
int vis[100][100];//标记点是否用过
int a[100][100];//存矩阵
//两个方向
int dx[4]={0,1};
int dy[4]={1,0};
void dfs(int a,int b)
{
if( a==n-1&&b==m-1)//终止条件
{ //操作:计数 for输出 等
return ;
}
for(int i=0;i<2;i++)//for(i=0;i<4;i++) for(i=0;i<8;i++) 遍历方向
{
//坐标变换
int tx=a+dx;
int ty=b+dy;
if(1/*位置条件判断*/)//不符合 continue
if(vis[tx][ty]==0&&1/*矩阵范围*/)//点是否使用过
{
vis[tx][ty]=1; //点已用
dfs(tx,ty); //递归
vis[tx][ty]=0; //回溯
}
}
int main()
{
cin>>n>>m;//输入范围
vis[0][0]=1;//标记起点已经使用
dfs(0,0);
cout<<cnt;//输出结果
return 0;
}
dfs模板
最新推荐文章于 2024-08-09 21:26:42 发布