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;
}