SSL-ZYC 2324 取数

题目大意:
这里写图片描述


思路:

DFS爆搜!

虽然是最后一名但是还是过了
枚举每一个初始点和下一个要到的点,计算出两点的差值,之后继续往下搜索,只要到达的点减去上一次到达的点等于这个差值就可以,否则就退出。

P.S.:不用在意“升序排列”这几个字,因为一个降序排列的等差数列反过来(即倒着搜)就是升序排列。


代码:

#include <cstdio>
#include <algorithm>
using namespace std;

int n,m,a[111][111],b[10011],maxn,t;

void dfs(int x,int y,int k,int o)  //分别表示该点所在的行,列,找过了多少个点和差值
{
    if (k>maxn) maxn=k;  //记录最佳答案
    if (x>1&&a[x-1][y]-a[x][y]==o) dfs(x-1,y,k+1,o);
    if (x<n&&a[x+1][y]-a[x][y]==o) dfs(x+1,y,k+1,o);
    if (y>1&&a[x][y-1]-a[x][y]==o) dfs(x,y-1,k+1,o);
    if (y<m&&a[x][y+1]-a[x][y]==o) dfs(x,y+1,k+1,o);  //向四个方向继续搜
    return;
} 

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
     for (int j=1;j<=m;j++)
       scanf("%d",&a[i][j]);
    for (int i=1;i<=n;i++)
     for (int j=1;j<=m;j++)  //枚举每一个点
     {
        if (i>1&&a[i-1][j]>a[i][j]) dfs(i-1,j,2,a[i-1][j]-a[i][j]);  //枚举下一个去往的点,计算差值
        if (i<n&&a[i+1][j]>a[i][j]) dfs(i+1,j,2,a[i+1][j]-a[i][j]);
        if (j>1&&a[i][j-1]>a[i][j]) dfs(i,j-1,2,a[i][j-1]-a[i][j]);
        if (j<m&&a[i][j+1]>a[i][j]) dfs(i,j+1,2,a[i][j+1]-a[i][j]);
     }
    if (maxn==0) maxn=1;  //至少能去一个点
    printf("%d\n",maxn); 
    return 0;
}
posted @ 2018-05-19 13:32  全OI最菜  阅读(83)  评论(0编辑  收藏  举报