zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Photon3Unity3D.dll 解析三——OperationRequest、OperationResponse
    关于VS2010的一些操作
    Photon3Unity3D.dll 解析二——EventData
    Photon3Unity3D.dll 解析一
    关于U3D中的移动和旋转
    U3D的一些常用基础脚本
    U3D模拟仿真实现
    构建基于TCP的应用层通信模型
    TCP协议的三次握手
    Python生成随机字符串
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/9313063.html
Copyright © 2011-2022 走看看