top1编程
← 返回题目
题解

过河卒

1 条题解

  • 0
    @ 2026-7-28 22:44:55
    #include<iostream>
    using namespace std;
    long B[21][21];//定义棋盘 
    
    int main(){
    	int n,m;//目标点的坐标
    	int a,b;//马所在点的坐标
    	
    	cin>>n>>m>>a>>b;
    	
    	//初始化棋盘:假设到达目标点(n,m)前每个点都可以通行设置成1
    	for(int i=0;i<=n;i++) 
    		for(int j=0;j<=m;j++)
    			B[i][j]=1;
    			
    	//将马控制的点设置成0,代表不能通过
    	//控制马上边的4个点,只要不超过边届,则为控制点  
    	if(a-2>=0&&b-1>=0)  
    		B[a-2][b-1]=0; 
    		    
    	if(a-2>=0&&b+1<=m)   
    		B[a-2][b+1]=0; 
    		 
    	if(a-1>=0&&b-2>=0)  
    		B[a-1][b-2]=0; 
    		 
    	if(a-1>=0&&b+2<=m)  
    		B[a-1][b+2]=0; 
    	
    	//马下边的4个点,只要不超过边届,则为控制点	  
    	if(a+1<=n&&b-2>=0)  
    		B[a+1][b-2]=0; 
    	
    	if(a+2<=n&&b-1>=0)  
    		B[a+2][b-1]=0;  
    		
    	if(a+1<=n&&b+2<=m)  
    		B[a+1][b+2]=0;  
    		
    	if(a+1<=n&&b+1<=m)  
    		B[a+2][b+1]=0;
    	
    	//马所在点不能	  
    	B[a][b]=0;  
    	
    	for(int i=0;i<=n;i++){
    		for(int j=0;j<=m;j++){
    			//如果可行 
    			if(B[i][j]){
    				
    				 if(i==0&&j==0)
    				  continue;  
                	 		else if(i==0)  
    					B[i][j]=B[i][j-1]; //目标点在最上面一行的时候 
                	 		else if(j==0)  
    					 B[i][j]=B[i-1][j];//目标点在最左边一行 
                	 		else 
    					B[i][j]=B[i-1][j]+B[i][j-1];//到达目标点路径=上点路径+左点路径 
    				
    			}
    		}
    	}
    	
    	cout<<B[n][m]<<endl;
    	 
    }
    
    • 1