问题描述
刷微博,编程序。如下图所示,@北京发布 提出了如下“头脑震荡”问题。对此问题做一般化描述:
有n阶方阵,从矩阵的左下角元素为起点,从行或列(水平或垂直)两个方向上移动,直到右上角。求出有多少条路径可以使得经过的元素累加值最大,最大值是多少。
输入格式
共有n+1行。
第一行整数n,表示矩阵的阶数,2<=n<=10。
第二行起,每行n个整数,以空格分隔,共n行。。
输出格式
一行,两个空格分隔的数,第一个表示最大值路径的条数,第二个表示最大值。
样例输入
5
4 5 4 5 6
2 6 5 4 6
2 6 6 5 2
4 5 2 2 5
5 2 5 6 4
样例输出
3 47
/小呆瓜!!!太粗心了吧,一开始在找问什么总是运行超时,仔细一看 忽略了跳出递归的一个条件(
if(route>2*m-1)
return ;
)
!!!还要注意 路径长度为边长的二倍减一!!!!!
我可真是个憨憨
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int m;
int visit[100][100],f=0,k=0;
int p[4][2]={{-1,0},{1,0},{0,-1},{0,1} };
void DFS(int a[][100],int i,int j,int route,int sum){
if(route>2*m-1)
return ;
if(visit[i][j]==1)
return ;
if(i==0&&j==m-1)
if(route!=2*m-1)
return ;
if(route==2*m-1)
{
if(i==0&&j==m-1)
{
if(sum>f)
{
f=sum;
k=1;
}
else if(sum==f)
k++;
}
else
return ;
}
visit[i][j]=1;
for(int t=0;t<4;t++)
{
int x,y;
x=i+p[t][0];
y=j+p[t][1];
if(x>=0&&x<m&&y>=0&&y<m&&visit[x][y]==0)
{
route++;
sum+=a[x][y];
// cout<<a[x][y]<<" ";
DFS(a,x,y,route,sum);
sum-=a[x][y];
visit[x][y]=0;
route--;
}
}
}
int main(){
int a[100][100];
cin>>m;
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
DFS(a,m-1,0,1,a[m-1][0]);
cout<<k<<" "<<f;
}