首页 > 其他分享 >洛谷p1002(过河卒)

洛谷p1002(过河卒)

时间:2024-04-04 14:00:00浏览次数:27  
标签:25 洛谷 int p1002 else && 过河 棋盘 赋值

题目描述 

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

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

输入

键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y)

输出

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

题目分析

一、模拟棋盘用一个二维数组

二、设计移动路线算法

1.dfs

可以想到dfs,直接深搜,采用递归的方法来写(不过运行时间不够用)

就直接给出代码看一下好了,应该答案是不会有问题的

#include <stdio.h>

int count=0;
int m_x[2]={0,1};
int m_y[2]={1,0};
static int a[25][25];
void f(int n,int m,int x,int y){
	int i;
	if(n==x&&m==y)
	count++;
	else
	for(i=0;i<=1;i++){
		if(a[n+m_x[i]][m+m_y[i]]==0&&n+m_x[i]<=x&&m+m_y[i]<=y){
			a[n+m_x[i]][m+m_y[i]]==1;
			f(n+m_x[i],m+m_y[i],x,y);
			a[n+m_x[i]][m+m_y[i]]==0;
		}
	}
}

int main(){
	int n,m,x,y;
	scanf("%d%d%d%d",&n,&m,&x,&y);
    a[x][y]=1;
	a[x+2][y+1]=1;
	a[x+1][y+2]=1;
	a[x-1][y+2]=1;
	a[x-2][y+1]=1;
	a[x-2][y-1]=1;
	a[x-1][y-2]=1;
	a[x+1][y-2]=1;
	a[x+2][y-1]=1;
	f(0,0,n,m);
	printf("%d",count);
	
	return 0;
}

2.直接递推 

递推怎么个推法呢,很显然可以用到这样一个数学知识,计数原理

高中学过分类加法和分步乘法

这里用什么呢,我选择做加法,为什么呢

因为其实仔细想想,卒的走法也就两种向左或向下

先看代码吧

for(i=0;i<=n;i++){
    	for(j=0;j<=m;j++){
    		if(i!=0||j!=0)
    		if(a[i][j]!=0){
    		if(i>0&&j>0)
    		a[i][j]=a[i][j-1]+a[i-1][j];
    		else if(i==0)
    		a[i][j]=a[i][j-1];
			else
			a[i][j]=a[i-1][j];
			}
		}
	}

棋盘上的每一个点都有两条到的路线从左或从上,这就是关键

细节问题(可以先看下面的代码)

看这个之前可以先看看下面的代码,这里是说一下赋值的问题,我之所以那样赋值其实是由我的核心算法决定的,那个赋值为1没必要全赋值是1,主要是赋值0,控制点不能过要相应减少一种路径,由于是加法加0即好

完整代码 

#include <stdio.h>

static long long int a[25][25];        //模拟棋盘
int main(){
	int n,m,x,y;
	scanf("%d%d%d%d",&n,&m,&x,&y);
	int i,j;
	for(i=0;i<=n;i++){                //初始化
    	for(j=0;j<=m;j++){
    		a[i][j]=1;                //这次的1有讲究,下面的0也是
    	}
    }
    a[x][y]=0;
	a[x+2][y+1]=0;
	a[x+1][y+2]=0;
	if(x-1>=0)                      //是否不在棋盘内
	a[x-1][y+2]=0;
	if(x-2>=0)
	a[x-2][y+1]=0;
	if(x-2>=0&&y-1>=0)
	a[x-2][y-1]=0;
	if(x-1>=0&&y-2>=0)
	a[x-1][y-2]=0;
	if(y-2>=0)
	a[x+1][y-2]=0;
	if(y-1>=0)
	a[x+2][y-1]=0;

    for(i=0;i<=n;i++){             //核心算法
    	for(j=0;j<=m;j++){
    		if(i!=0||j!=0)
    		if(a[i][j]!=0){
    		if(i>0&&j>0)
    		a[i][j]=a[i][j-1]+a[i-1][j];
    		else if(i==0)
    		a[i][j]=a[i][j-1];
			else
			a[i][j]=a[i-1][j];
			}
		}
	}
	printf("%lld",a[n][m]);
	
	return 0;
}

标签:25,洛谷,int,p1002,else,&&,过河,棋盘,赋值
From: https://blog.csdn.net/2301_79695613/article/details/137298872

相关文章

  • 洛谷 P1004 [NOIP2000 提高组] 方格取数
    题意:n*n的方格,从左上角到右下角两次。每一次经过的路径中,如果有数字,数字都会变成0并计数。求两次路径的最大计数。思路:线性dp,从左上角到右下角步数固定为2*n-2步。初始时0步dp[0][1][1]=grid[1][1],知道了x1和x2可以确定对应的y,可以直接进行状态转移。可以增加剪枝:x<=m......
  • 洛谷 P1196 [NOI2002] 银河英雄传说
    题意:30000列军队,每列初始有1个。编号从1~30000.每次操作有两种,将现在第i列所在的列合并到第j列所在列的末尾。或者查询第i列举例第j列的距离。思路:带权并查集。合并时将第i列头节点接到第j列头节点上。然后直接查询dist取绝对值相减就好。总结:一开始没看清题,以为要把从i列从当......
  • P1002 [NOIP2002 普及组] 过河卒
    emmmm...据说是比较简单的dp?(再一次意识到自己的菜)链接:https://www.luogu.com.cn/problem/P1002题目:总的思路就是一个状态转移方程吧:dp[x][y]=dp[x-1][y]+dp[x][y-1];然后如果发现这个点不能通过,那么强制修改dp[x][y]=0;代码:#include<iostream>#include<vector>#inc......
  • 洛谷:P8671 [蓝桥杯 2018 国 AC] 约瑟夫环
    时间限制1.00s     内存限制256.00MB     难易度:普及+/提高【题目描述】n 个人的编号是1∼n,如果他们依编号按顺时针排成一个圆圈,从编号是 1 的人开始顺时针报数。(报数是从 1 报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从 1 开始报......
  • 每日一题 第六十六期 洛谷 小朋友排队
    [蓝桥杯2014省B]小朋友排队题目描述nnn个小朋友站成一排。现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友。每个小朋友都有一个不高......
  • 洛谷题单指南-图的基本应用-P1347 排序
    原题链接:https://www.luogu.com.cn/problem/P1347题意解读:在给出多对关系字母的比较关系之后,判断能否确定所有字母的顺序。解题思路:对字母的关系建立图,如A<B建立A指向B的一条边。如果在拓扑排序过程中,每次寻找入度为0的点只有一个,且最终可以形成拓扑序,则可以确定所有字母的顺......
  • 【洛谷 P8695】[蓝桥杯 2019 国 AC] 轨道炮 题解(映射+模拟+暴力枚举+桶排序)
    [蓝桥杯2019国AC]轨道炮题目描述小明在玩一款战争游戏。地图上一共有NNN个敌方单位,可以看作2D平面上的点。其中第i......
  • 【洛谷 P8672】[蓝桥杯 2018 国 C] 交换次数 题解(字符串+映射+全排列)
    [蓝桥杯2018国C]交换次数题目描述IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:ABABTATT,这使得应聘者十分别扭。于是,管理部门要求招聘方进行必要的......
  • 【洛谷 P8700】[蓝桥杯 2019 国 B] 解谜游戏 题解(字符串+映射+周期性)
    [蓝桥杯2019国B]解谜游戏题目背景题目描述小明正在玩一款解谜游戏。谜题由242424根塑料棒组成,其中黄色塑料棒4......
  • 洛谷题单指南-图的基本应用-P1363 幻象迷宫
    原题链接:题意解读:迷宫可以无限扩展,对第一个样例进行模拟,扩展4块的示意图:从起点S,沿着红色虚线,是可以无限走下去的,要判断是否能够无限走下去。解题思路:直观上,会考虑把迷宫复制多块,但是会面临2个问题:1、内存可能爆掉2、如何有效判断可以无限走下去?只考虑竖向或者横向连通是不......