有注释的P1002 过河卒悬关求调
查看原帖
有注释的P1002 过河卒悬关求调
1609668
Eternal_thoughts楼主2024/12/8 15:36
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define r0 return 0
#define ew 5005
int dx[]={-2,-1,1,2,2,1,-1,-2};
int dy[]={1,2,2,1,-1,-2,-2,-1};
int vis[ew][ew];//标记数组 
int dp[ew][ew];//dp数组 
signed main(){
	int m1,m2,b1,b2;
	cin>>m1>>m2>>b1>>b2;
	vis[b1][b2]=1;
	//标记那些地方被马控制了 
	for(int i=0;i<8;i++){
		int xx=b1+dx[i];
		int yy=b2+dy[i];
		vis[xx][yy]=1;
	}
	
	//初始行和列提前预判 
	for(int i=0;i<=m1;i++){
		if(vis[i][0]!=1){
			dp[i][0]=1;
		}
	}
	for(int j=0;j<=m2;j++){
		if(vis[0][j]!=1){
			dp[0][j]=1;
		}
	}
	//上下左右四个方向的dp 
	for(int i=1;i<=m1;i++){
		for(int j=1;j<=m2;j++){
			if(vis[i][j]==1){
				continue;
			}
			dp[i][j]=dp[i-1][j]+dp[i][j-1]+dp[i+1][j]+dp[i][j+1];
		}
	}
	cout<<dp[m1][m2]<<endl;
	//这里是输出过程,下面的注释,不算主程序 
	for(int i=0;i<=m1;i++){
		for(int j=0;j<=m2;j++){
			cout<<vis[i][j]<<" ";
		}
		cout<<endl;
	}
	
	cout<<endl;
	
	for(int i=0;i<=m1;i++){
		for(int j=0;j<=m2;j++){
			cout<<dp[i][j]<<" ";
		}
		cout<<endl;
	}
	
	r0;
}

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