• SSLZYC 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;
    }
  • 相关阅读:
    程序员修炼之道阅读笔记2
    程序员修炼之道阅读笔记1
    软件体系架构的质量属性
    计算贴现率相关问题
    以《淘宝网》为例,描绘质量属性的六个常见属性场景
    第十四周总结
    软件需求模式阅读笔记
    第十三周总结
    第十二周总结
    重大技术需求进度报告六
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313063.html
Copyright © 2020-2023  润新知