C++スキー

1819 ワード

試験問題の説明:
LYHはスキーが好きです.スキーは确かに刺激的ですが、スピードを得るためには、滑るエリアを下に傾けなければなりません.LYHが坂の底まで滑ると、再び上り坂を歩かなければなりません.ヘリコプターが彼を乗せに来るのを待たなければなりません.LYHは1つのエリアの中で最も長い滑り坂を知りたいです.勾配の長さは、点を通過する個数によって計算され、領域は2次元配列によって与えられ、配列の各数値は点の高さを表す.次に例を示す:1 2 3 4 5 16 17 19 6 15 24 25 20 7 14 23 22 21 8 13 11 10 9人は、ある点から上下左右に隣接する4つの点の1つにスライド可能であり、かつ高さが減少する場合にのみ、上記の例では、1本の実行可能な滑り坂は25-24-17-16-1(25から1まで)であり、もちろん25-24......2...1はより長く、実際にはこれが最も長い.
入力:
入力された第1の挙動は、領域の2次元配列の行数Rおよび列数C(1≦R、C≦100)の下にR行があり、各行にC個の数が高さを表す.
出力:
出力領域で最も長い勾配の長さ.
入力例:
5 51 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9
出力例:
25
運転時間制限:1000 ms;運行スペース制限:51200 KB;コード長制限:200000 B
#include
#include
using namespace std;
int dx[5]={0,-1,0,1,0},
    dy[5]={0,0,1,0,-1};
long r,c,i,j,p,t,ans;
long m[101][101],f[101][101];
int search(int,int);
int main()
{
	cin>>r>>c;
	ans=0;
	for(i=1;i<=r;i++)
	  for(j=1;j<=c;j++)
	    cin>>m[i][j];
   for(i=1;i<=r;i++)
     for(j=1;j<=c;j++)
     {
     	t=search(i,j);
     	f[i][j]=t;
     	if(t>ans)ans=t;
	 }
  cout<0)
	{
		return(f[x][y]);
	}
	t=1;
	for(i=1;i<=4;i++)
	  {
	  	nx=x+dx[i];
	  	ny=y+dy[i];
	  	if((nx>=1)&&(nx<=r)&&(ny>=1)&&(ny<=c)&&(m[x][y]t)t=tmp;
	      }
	  }
	  f[x][y]=t;
	  return(t);
}

検索した問題.(再帰は上にも置けます)
まず、2 D配列を定義することに注意してください.
次に入力し、ネストされたループを使用します.
その後、dfs(コード内のsearch)を行い、
dxとdyを定義し、それぞれ上下左右の4つの方向を計算します.
しかし、私たちは一度だけ行う必要があるので、一度判断しなければなりません.
if(f[x][y]>0)
	{
		return(f[x][y]);
	}
dfs , dfs 。

 
転載先:https://www.cnblogs.com/FXY-180/p/9511459.html