蓝桥杯2013c++真题:振兴中华

蓝桥杯2013c++真题:振兴中华_第1张图片

思路一:dfs暴力搜索

从我做起振兴中华分别为12345678

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

迷宫问题模板

dfs(x,y,path)                                //从(x,y)深度优先搜索

if((x,y为终点坐标))

①x,y加入路径

②输出路径

③路径中去除(x,y)

剪枝函数:如果x,y越界,return

//(x,y)不是终点

●for(循环):(注意for循环写在外面)

①(x,y)加入路径

②如果邻接情况位被访问,访问(x,y)的邻接情况

     dfs(x+方向矢量,y+方向矢量)

③路径中去除(x,y)

 

 mat[x][y]={}//迷宫数组(0,0)开始

vis[x][y]={{0}...}//vis数组防止重复经过

void dfs(x,y,path)
{
  if(x==endx&&y==endy)
{
  vis[x][y]=1
  path.push_back({x,y});
  cout<matx||y>maty)return;//防止越界


//方向1
path.push_back({x,y});
if(x+1<=matx&&vis[x+1][y]==0&&能够访问)
{
vis[x+1][y]=1;
dfs(x+1,y,path);
vis[x+1][y]=0;


//其他方向类似
}



}

#include
using namespace std;
int mat[4][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{4,5,6,7,8}};
int cnt=0;
int vis[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};
int dic[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; 
void dfs(int x,int y,vector>path)
{
if(x==3&&y==4)
{
	path.push_back({x,y});
	vis[x][y]=1;
	cnt++;
	path.pop_back();
	vis[x][y]=0;
	return;
}
if(x<0||x>4||y<0||y>5)
return;


path.push_back({x,y});
if(x+1<=3&&vis[x+1][y]==0&&mat[x+1][y]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x+1][y]=1;
dfs(x+1,y,path);
vis[x+1][y]=0;
}
path.pop_back();


path.push_back({x,y});
if(x-1>=0&&vis[x-1][y]==0&&mat[x-1][y]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x-1][y]=1;
dfs(x-1,y,path);
vis[x-1][y]=0;
}
path.pop_back();


path.push_back({x,y});
if(y+1<=4&&vis[x][y+1]==0&&mat[x][y+1]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x][y+1]=1;
dfs(x,y+1,path);
vis[x][y+1]=0;
}
path.pop_back();


path.push_back({x,y});
if(vis[x][y-1]==0&&y-1>=0&&mat[x][y-1]-mat[path[path.size()-1][0]][path[path.size()-1][1]]==1)
{
vis[x][y-1]=1;
dfs(x,y-1,path);
vis[x][y-1]=0;
}
path.pop_back();
}
int main()
{
vector>path;
	dfs(0,0,path);
	cout<

第二种方法:递归

思路:经过观察,只要一直向右走或者向下走到达终点,就是一种情况

算法题的5种解法:

蓝桥杯2013c++真题:振兴中华_第2张图片

 本题思路

#include
using namespace std;
//如果只有1行只能向右走,有一种走法
//f(x,y)为从(1,1)走到(x,y)有多少种走
//f(x,y)是从f(x,y-1)或f(x-1,y)走过来的
//递归方程:f(x,y)=f(x,y-1)+f(x-1,y) 
int f(int x,int y)
{
	if(x==1||y==1)
	{
		return 1;
	}
	return f(x,y-1)+f(x-1,y);
 } 
 int main()
 {
 	cout<

本题和leetcode62题思路一样

 Leetcode62. 不同路径_m0_52043808的博客-CSDN博客

你可能感兴趣的:(LeetCode,算法,蓝桥杯,c++,职场和发展)