zoukankan      html  css  js  c++  java
  • CODE[VS] 1010 过河卒

    题目描述 Description

     如图,A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C)。卒不能通过对方马的控制点。


      棋盘用坐标表示,A 点(0,0)、B 点(n,m)(n,m 为不超过 20 的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定: C不等于A,同时C不等于B)。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数。

    1<=n,m<=15

    输入描述 Input Description

     键盘输入
       B点的坐标(n,m)以及对方马的坐标(X,Y){不用判错}

    输出描述 Output Description

      屏幕输出
        一个整数(路径的条数)。

    样例输入 Sample Input

     6 6 3 2

    样例输出 Sample Output

    17

    数据范围及提示 Data Size & Hint

    如描述


    对于这个棋盘类型的动态规划方法。
    对于马所能到达的地方初始化为0
    动态转移方程为:
    dp[i][j] = dp[i -1][j] + dp[i][j - 1]  (i >0 && j > 0)
    dp[i][j] = dp[i - 1][j] (j == 0)
    dp[i][j] = dp[i][j - 1] (i == 0)

    根据方程写出我们的代码:
    *//*************************************************************************
        > File Name: 过河卒.cpp
        > Author: zhanghaoran
        > Mail: chilumanxi@gmail.com
        > Created Time: 2015年06月30日 星期二 19时02分51秒
     ************************************************************************/
    
    #include <iostream>
    #include <algorithm>
    #include <utility>
    #include <string.h>
    using namespace std;
    
    int mx, my;
    int dp[16][16];
    int bx, by;
    
    int main(void){
    	cin >> bx >> by >> mx >> my;
    	for(int i = 0; i <= bx; i ++){
    		for(int j = 0; j <= by; j ++){
    			dp[i][j] = 1;
    		}
    	}
     if(mx - 2 >= 0 && my - 1 >= 0){
    		dp[mx - 2][my - 1] = 0;
    	}
    	if(mx + 2 <= bx && my - 1 >= 0){
    		dp[mx + 2][my - 1] = 0;
    	}
    	if(mx + 2 <= bx && my + 1 <= by){
    		dp[mx + 2][my + 1] = 0;
    	}
    	if(mx - 2 >= 0 && my + 1 <= by){
    		dp[mx - 2][my + 1] = 0;
    	}
    	if(mx - 1 >= 0 && my - 2 >= 0){
    		dp[mx - 1][my - 2] = 0;
    	}
    	if(mx - 1 >= 0 && my + 2 <= by){
    		dp[mx - 1][my + 2] = 0;
    	}
    	if(mx + 1 <= bx && my - 2 >= 0){
    		dp[mx + 1][my - 2] = 0;
    	}
    	if(mx + 1 <= bx && my + 2 <= by){
    		dp[mx + 1][my + 2] = 0;
    	}
    	dp[mx][my] = 0;
     	for(int i = 0; i <= bx; i ++){
    		for(int j = 0; j <= by; j ++){
    			if(!dp[i][j])
    				continue;
    			else if(i == 0 && j == 0)
    				continue;
     			else if(i == 0)
    				dp[i][j] = dp[i][j - 1];
    			else if(j == 0)
    				dp[i][j] = dp[i - 1][j];
    			else
    				dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    		}
    	}
    	cout << dp[bx][by] << endl;
    	return 0;
    }


  • 相关阅读:
    POJ 2236 Wireless Network(并查集)
    POJ 2010 Moo University
    POJ 3614 Sunscreen(贪心,区间单点匹配)
    POJ 2184 Cow Exhibition(背包)
    POJ 1631 Bridging signals(LIS的等价表述)
    POJ 3181 Dollar Dayz(递推,两个long long)
    POJ 3046 Ant Counting(递推,和号优化)
    POJ 3280 Cheapest Palindrome(区间dp)
    POJ 3616 Milking Time(dp)
    POJ 2385 Apple Catching(01背包)
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136124.html
Copyright © 2011-2022 走看看