求解惑
查看原帖
求解惑
1396740
BYER_FIGHTING楼主2024/8/15 14:36

可以帮忙看看这两段代码功能上有什么区别吗?为什么第一个可以通过所有样例,但是第二个例3,4会错误吗?

#include<bits/stdc++.h>
using namespace std;
//动态规划 递推式与终止条件
//f[x,y]=f[x-1,y]+f[x,y-1] 
//f[0,0]=1,f[0,y]=1,f[x,0]=1,f[马]=0 

int main(){
	int x,y;//终点 
	int n,m;//马的位置
	cin>>x>>y;
	cin>>n>>m; 
	vector< vector<long long>> a(x+1,vector<long long> (y+1,0));
	for(int i=0;i<=x;i++){//注意计算顺序 
		for(int j=0;j<=y;j++){//处于马点时为0
			if((max(abs(j-m),abs(i-n)))==2&&(abs(i-n)+abs(j-m)==3)||(i==n&&j==m)){
				//cout<<"*"<<" ";
				continue;
			}
			else if(i==0&&j==0){//不能将所有边界的都设为1,可能存在边界有点走不到,导致后面的全部不可能走到 
				a[i][j]=1;
			}else {
## 				 _改动位置_ **if(i) //不是第一行
					a[i][j]+=a[i-1][j];
				if(j)//不是第一列
					a[i][j]+=a[i][j-1];**
			}
			//cout<<a[i][j]<<" ";
		}
		//cout<<endl;
	}
	if(x==0&&y==0){
		cout<<0<<endl;
		return 0;
	}
	cout<<a[x][y]<<endl;
	return 0;
}

第二个代码:

#include<bits/stdc++.h>
using namespace std;
//动态规划 递推式与终止条件
//f[x,y]=f[x-1,y]+f[x,y-1] 
//f[0,0]=1,f[0,y]=1,f[x,0]=1,f[马]=0 

int main(){
	int x,y;//终点 
	int n,m;//马的位置
	cin>>x>>y;
	cin>>n>>m; 
	vector< vector<long long>> a(x+1,vector<long long> (y+1,0));
	for(int i=0;i<=x;i++){//注意计算顺序 
		for(int j=0;j<=y;j++){//处于马点时为0
			if((max(abs(j-m),abs(i-n)))==2&&(abs(i-n)+abs(j-m)==3)||(i==n&&j==m)){
				continue;
			}
			else if(i==0&&j==0){//不能将所有边界的都设为1,可能存在边界有点走不到,导致后面的全部不可能走到 
				a[i][j]=1;
			}else {
				 _改动位置_ **int p=0,q=0;
				if(i-1>=0) //不是第一行
					p=a[i-1][j];
				if(j-1>=0)//不是第一列
					q=a[i][j-1];
				a[i][j]=p+q;**
			}
			//cout<<a[i][j]<<" ";
		}
		//cout<<endl;
	}
	if(x==0&&y==0){
		cout<<0<<endl;
		return 0;
	}
	cout<<a[x][y]<<endl;
	return 0;
}

谢谢!

2024/8/15 14:36
加载中...