当前位置: 代码迷 >> 综合 >> 3450. 【NOIP2013模拟联考3】山峰(summits) (Standard IO)
  详细解决方案

3450. 【NOIP2013模拟联考3】山峰(summits) (Standard IO)

热度:31   发布时间:2023-10-09 10:29:47.0

Description

作为地质学家的JIH,为了绘制地图进行了野外考察。考察结束,他得到了一张n*m的地面高度地图。为了科学研究,JIH定义了一种山峰叫做d-山峰。一个高度为h地点被称作d-山峰,只有满足从这里出发,在不经过小于等于h-d的地点的前提下无法达到比它更高的地方。JIH正纠结于怎么分礼物,标出d-山峰的任务就交给你了。

Input

第一行n,m,d
第二行开始,有一个n*m的矩阵表示地图,用空格隔开。

Output

输出d-山峰的个数。

Sample Input

6 10 2
0 0 0 0 0 0 0 0 0 0
0 1 2 1 1 1 1 0 1 0
0 2 1 2 1 3 1 0 0 0
0 1 2 1 3 3 1 1 0 0
0 2 1 2 1 1 1 0 2 0
0 0 0 0 0 0 0 0 0 0

Sample Output

4

Data Constraint

30% n,m<=10
100% n,m<=500

###思路

一开始只想搜索要点分,后来优化一下就过了。
对于每个点dfs一次,判断是否为山峰,而对于走过的点如果清空就会很耗时间,所以第一次dfs时走过的点记为1,第二次为2,以此类推就不用清空数组了。
vara,b:array[0..600,0..600] of longint;n,m,d,x,h:longint;f:boolean;
procedure dfs(y,z,s:longint);
beginb[y,z]:=s;if (y<=0)or(z<=0)or(y>n)or(z>m) then exit;if a[y,z]>h then f:=false;if not f then exit;if (a[y,z-1]>h-d)and(b[y,z-1]<>s)and(f) thendfs(y,z-1,s);if (a[y,z+1]>h-d)and(b[y,z+1]<>s)and(f) thendfs(y,z+1,s);if (a[y-1,z]>h-d)and(b[y-1,z]<>s)and(f) thendfs(y-1,z,s);if (a[y+1,z]>h-d)and(b[y+1,z]<>s)and(f) thendfs(y+1,z,s);
end;
vari,j,ans:longint;
beginreadln(n,m,d);for i:=1 to n dofor j:=1 to m doread(a[i,j]);x:=0;ans:=0;for i:=1 to n dobeginfor j:=1 to m dobegininc(x);h:=a[i,j];f:=true;dfs(i,j,x);if f then inc(ans);end;end;writeln(ans);
end.
  相关解决方案