1 条题解

  • 0
    @ 2025-2-15 10:17:29

    这道题就是纯纯的模拟,只要遍历当前点的上下左右四个方向,找出最大值加到sum上去,并走到那个点直到终点即可。

    本题一般是用while循环来做,当然用递归也不是不可以。

    为了防止抄袭,我只贴关键代码😄 :

    int n,m,a[50][50],sum;
    int x,y,mx,mxx,mxy,tx,ty;//有关方向的变量
    //方向数组 
    int fx[5]={0,0,1,0,-1}; 
    int fy[5]={0,1,0,-1,0};
    
    while(1);//别抄 
    sum=a[1][1],x=y=1,a[1][1]=0;//初始化 
    while(x!=n||y!=m){//while更好写 
    	mx=0;//mx初始化 
    	//木瓜吃掉就没了
    	a[x][y]=0;//标记可以预防重复吃、死循环 
    	for(int i=1;i<=4;i++){//遍历方向数组,找新方向
    		//新方向 
    		tx=x+fx[i];
    		ty=y+fy[i];
    		//判断有无出边界(0不用,去比较也没用 
    		if(tx>=1&&tx<=n&&ty>=1&&ty<=m){
    			if(a[tx][ty]>mx){
    				//更新最大值及最大值位置 
    				mx=a[tx][ty];
    				mxx=tx;
    				mxy=ty;
    			}
    		}
    	}
    	//累加到sum上 
    	sum+=mx;
    	//更新x和y 
    	x=mxx;
    	y=mxy;
    }
    

    再给大家来一个递归代码(关键的):

    int n,m,a[50][50],sum;
    int fx[5]={0,0,1,0,-1};
    int fy[5]={0,1,0,-1,0};
    //dfs我随便取的,大佬勿喷 
    void dfs(int x,int y){
    	//累加到sum上
    	sum+=a[x][y];
    	a[x][y]=0;//木瓜吃掉就没了
    	if(x==n&&y==m){//终点 
    		cout<<sum;//也可以在main里输出 
    		return ;
    	}
    	int tx,ty,mxx,mxy,mx=0;//有关方向的变量
    	for(int i=1;i<=4;i++){
    		//新方向
    		tx=x+fx[i];
    		ty=y+fy[i];
    		//判断有无出边界
    		if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]!=0){
    			if(a[tx][ty]>mx){
    				mx=a[tx][ty];
    				mxx=tx;
    				mxy=ty;
    			}
    		}
    	}
    	//递归下一个点 
    	dfs(mxx,mxy);
    }
    

    这两个代码实现思路基本相同,就是开头那个思路:

    遍历当前点的上下左右四个方向,找出最大值加到sum上去,并走到那个点直到终点即可。

    只是写法不同而已。

    • 1

    信息

    ID
    457
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    17
    已通过
    5
    上传者