acm 1088 滑雪问题,提交的答案为wrong answer
最近在做acm的题目,在这1088号题目:滑雪遇到了问题http://acm.pku.edu.cn/JudgeOnline/problem?id=1088我在自己的机器上...
最近在做acm的题目,在这1088号题目:滑雪遇到了问题http://acm.pku.edu.cn/JudgeOnline/problem?id=1088
我在自己的机器上做的时候用条件测试是正确的,但是提交后却是说是wrong answer……求解……
附我的程序(C++):
#include <iostream>
using namespace std;
int nmax = 0;
int a[100][100];
int R, C = 0;
int b(int temp,int x,int y,int n){
n++;
//上
if(x>0){
if(a[x-1][y] < temp){
b(a[x-1][y],x-1,y,n);
}
}
//下
if(x<R-1){
if(a[x+1][y] < temp){
b(a[x+1][y],x+1,y,n);
}
}
//左
if(y>0){
if(a[x][y-1] < temp){
b(a[x][y-1],x,y-1,n);
}
}
//右
if(y<C-1){
if(a[x][y+1] < temp){
b(a[x][y+1],x,y+1,n);
}
}
if(nmax < n){
nmax = n;
}
return nmax;
}
int main(void){
cin >> R >> C;
for(int i = 0; i< R;i++){
for(int j=0;j < C;j++){
cin >> a[i][j];
}
}
int max =0;
int x,y =0;
for(int i = 0; i< R;i++){
for(int j=0;j < C;j++){
if(a[i][j]>max){
max = a[i][j];
x = i;
y = j;
}
}
}
cout<< b(max,x,y,0)<<endl;
return 0;
} 展开
我在自己的机器上做的时候用条件测试是正确的,但是提交后却是说是wrong answer……求解……
附我的程序(C++):
#include <iostream>
using namespace std;
int nmax = 0;
int a[100][100];
int R, C = 0;
int b(int temp,int x,int y,int n){
n++;
//上
if(x>0){
if(a[x-1][y] < temp){
b(a[x-1][y],x-1,y,n);
}
}
//下
if(x<R-1){
if(a[x+1][y] < temp){
b(a[x+1][y],x+1,y,n);
}
}
//左
if(y>0){
if(a[x][y-1] < temp){
b(a[x][y-1],x,y-1,n);
}
}
//右
if(y<C-1){
if(a[x][y+1] < temp){
b(a[x][y+1],x,y+1,n);
}
}
if(nmax < n){
nmax = n;
}
return nmax;
}
int main(void){
cin >> R >> C;
for(int i = 0; i< R;i++){
for(int j=0;j < C;j++){
cin >> a[i][j];
}
}
int max =0;
int x,y =0;
for(int i = 0; i< R;i++){
for(int j=0;j < C;j++){
if(a[i][j]>max){
max = a[i][j];
x = i;
y = j;
}
}
}
cout<< b(max,x,y,0)<<endl;
return 0;
} 展开
1个回答
展开全部
如果我没理解错的话你的思路是找到最高的地方开始,但是最长的路的起点不一定在最高点,这组数据:
3 3
9 1 2
1 1 3
6 5 4
你的结果是2,但显然不对,你要把每个点都作为起点搜一遍,取最大的···
给你我的C程序,希望有帮助:
int a,b,num[100][100],f[100][100],v[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void search(int x,int y){
int i,max=0;
for(i=0;i<4;i++)if(x+v[i][0]<a&&x+v[i][0]>=0&&y+v[i][1]<b&&y+v[i][1]>=0)if(num[x+v[i][0]][y+v[i][1]]<num[x][y]){
if(!f[x+v[i][0]][y+v[i][1]])search(x+v[i][0],y+v[i][1]);
if(f[x+v[i][0]][y+v[i][1]]>max)max=f[x+v[i][0]][y+v[i][1]];
}
f[x][y]=max+1;
}
void main(){
int i,j,max=0;
scanf("%d %d",&a,&b);
for(i=0;i<a;i++)for(j=0;j<b;j++)scanf("%d",&num[i][j]);
for(i=0;i<a;i++)for(j=0;j<b;j++){
if(!f[i][j])search(i,j);
if(max<f[i][j])max=f[i][j];
}
printf("%d\n",max);
}
3 3
9 1 2
1 1 3
6 5 4
你的结果是2,但显然不对,你要把每个点都作为起点搜一遍,取最大的···
给你我的C程序,希望有帮助:
int a,b,num[100][100],f[100][100],v[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void search(int x,int y){
int i,max=0;
for(i=0;i<4;i++)if(x+v[i][0]<a&&x+v[i][0]>=0&&y+v[i][1]<b&&y+v[i][1]>=0)if(num[x+v[i][0]][y+v[i][1]]<num[x][y]){
if(!f[x+v[i][0]][y+v[i][1]])search(x+v[i][0],y+v[i][1]);
if(f[x+v[i][0]][y+v[i][1]]>max)max=f[x+v[i][0]][y+v[i][1]];
}
f[x][y]=max+1;
}
void main(){
int i,j,max=0;
scanf("%d %d",&a,&b);
for(i=0;i<a;i++)for(j=0;j<b;j++)scanf("%d",&num[i][j]);
for(i=0;i<a;i++)for(j=0;j<b;j++){
if(!f[i][j])search(i,j);
if(max<f[i][j])max=f[i][j];
}
printf("%d\n",max);
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询