zoukankan      html  css  js  c++  java
  • ACM题目————马拦过河卒

    题目描述

    棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
    棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

    输入

    一行四个数据,分别表示B点坐标和马的坐标。(保证所有的数据有解)

    输出

    一个数据,表示所有的路径条数。

    样例输入
    6 6 3 3
    样例输出
    6
     
    咋看之下,似乎就是一道搜索题,于是直接写了一个DFS。果断时间超限。代码如下:
    //马栏过河卒——时间超限
    using namespace std;
    int MAP[20][20];
    int n, m, mx, my, cnt;
    int dx[] = {1,0}, dy[] = {0,1};
    int a[8]={-2,-2,-1,-1,1,1,2,2};//马控制的方向
    int b[8]={1,-1,2,-2,2,-2,1,-1};
    
    void DFS(int x, int y)
    {
        if(MAP[x][y] || x<0 || x>n || y<0 || y>m) return ;//边界
        if( x == n && y == m )
        {
            cnt ++ ;
            return ;
        }
        MAP[x][y] = 1 ;
        for(int i=0; i<2; i++)
            DFS(x+dx[i],y+dy[i]);
        MAP[x][y] = 0 ;
    }
    
    
    int main()
    {
        cin >> n >> m >> mx >> my ;
        memset(MAP,0,sizeof(MAP));
        MAP[mx][my] = 1 ;
        for(int i=0; i<8; i++)
            MAP[mx+a[i]][my+b[i]] = 1 ;
        cnt = 0 ;
        DFS(0,0);
        cout << cnt << endl ;
    
        return 0;
    }
    

     后来,仔细想了会,就用递推给AC了!O(∩_∩)O哈哈~

    #include <bits/stdc++.h>
    
    using namespace std;
    int MAP[20][20];
    long long cot[20][20];
    int n, m, mx, my;
    int a[8]= {-2,-2,-1,-1,1,1,2,2}; //马控制的方向
    int b[8]= {1,-1,2,-2,2,-2,1,-1};
    
    
    int main()
    {
        while(cin >> n >> m >> mx >> my )
        {
            for(int i=0;i<20;i++)
                for(int j=0;j<20;j++)
                {
                    MAP[i][j]=1;//给数组初始化,赋为1,表可走
                    cot[i][j]=0;//计数
                }
    
            MAP[mx][my] = 0 ;//马控制的点
            for(int i=0; i<8; i++)
            {
                int x = mx + a[i] ;
                int y = my + b[i] ;
                if( x >=0 && x<20 && y>=0 && y<20)
                    MAP[x][y] = 0 ;
            }
            bool flag = true ;
            for(int i=0; i<20; i++)
            {
                if( flag )
                {
                    if(MAP[0][i]==0) flag = false ;
                    else cot[0][i] = 1 ;
                }
            }
            flag = true ;
            for(int i=0; i<20; i++)
            {
                if( flag )
                {
                    if(MAP[i][0]==0) flag = false ;
                    else cot[i][0] = 1 ;
                }
            }
    
            for(int i=1; i<20; i++)
                for(int j=1; j<20; j++)
                    if(MAP[i][j])
                        cot[i][j] = cot[i-1][j]*MAP[i-1][j]+cot[i][j-1]*MAP[i][j-1];
    
            cout << cot[n][m] << endl ;
        }
    
        return 0;
    }
    
    低调做人,高调做事。
  • 相关阅读:
    爬取豆瓣电影信息
    MongoDB的聚合操作以及与Python的交互
    matplotlib简单示例
    MongoDB基本操作
    K近邻算法
    Scrapy爬取博客园精华区内容
    爬虫失败
    Markdown基本使用方法
    UITableViewCell高度自适应变化
    KVO和NSNotification
  • 原文地址:https://www.cnblogs.com/Asimple/p/5516312.html
Copyright © 2011-2022 走看看