dfs模板

/*题目 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;
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值