[重返NOIP]动态规划1——NOIP2002普及组 过河卒

题目描述 棋盘上 $A$ 点有一个过河卒,需要走到目标 $B$ 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 $C$ 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表示,$A$ 点 $(0, 0)$、$B$ 点 $(n, m)$,同样马的位置坐标是需要给出的。 现在要求你计算出卒从 $A$ 点能够到达 $B$ 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。 输入格式 一行四个正整数,分别表示 $B$ 点坐标和马的坐标。 输出格式 一个整数,表示所有的路径条数。 样例 #1 样例输入 #1 6 6 3 3 样例输出 #1 6 提示 对于 $100 \%$ 的数据,$1 \le n, m \le 20$,$0 \le$ 马的坐标 $\le 20$。 【题目来源】 NOIP 2002 普及组第四题 思路 很简答,结合递归的想法,先把所有格子赋值为0,被马挡的格子标为2,只要碰到就return相应值就行 代码 #include<stdio.h> int bx,by,mx,my; int f(int **pan1,int bx1,int by1,int zx1,int zy1){ if(zy1+1<=by1&&zx1+1<=bx1){ if(pan1[zy1+1][zx1]==0||pan1[zy1][zx1+1]==0) return f(pan1,bx1,by1,zx1+1,zy1)+f(pan1,bx1,by1,zx1,zy1+1); else return 0; }else if(zy1==by1&&zx1+1<=bx1){ return f(pan1,bx1,by1,zx1,zy1+1); }else if(zy1+1<=by1&&zx1==bx1){ return f(pan1,bx1,by1,zx1+1,zy1); }else if(zy1==by1&&zx1==bx1){ return 1; }else return 0; } int main(){ scanf("%d %d %d %d",bx,by,mx,my); int zx=0,zy=0,pan[by+1][bx+1]; for(int i=0;i<=by;i++){ for(int j=0;j<=bx;j++){ pan[i][j]=0; } } pan[my][mx]=1; if(mx+1<=bx&&my+2<=my) pan[my+2][mx+1]=1; if(mx-1<=bx&&my+2<=my) pan[my+2][mx-1]=1; if(mx-2<=bx&&my+1<=my) pan[my+1][mx-2]=1; if(mx+2<=bx&&my+1<=my) pan[my+1][mx+2]=1; if(mx+1<=bx&&my-2<=my) pan[my-2][mx+1]=1; if(mx-1<=bx&&my-2<=my) pan[my-2][mx-1]=1; if(mx-2<=bx&&my-1<=my) pan[my-1][mx-2]=1; if(mx+2<=bx&&my-1<=my) pan[my-1][mx+2]=1; printf("%d",f(pan,bx,by,zx,zy)); } (由于尚未搞清的原因,上述代码还无法运行,具体错误也还没发现) ...

December 9, 2022 · 2 min · Red

[重返NOIP]模拟方法1——NOIP2003普及组 乒乓球

题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中 $11$ 分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白 $11$ 分制和 $21$ 分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。 题目描述 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在 $11$ 分制和 $21$ 分制下,双方的比赛结果(截至记录末尾)。 比如现在有这么一份记录,(其中 $\texttt W$ 表示华华获得一分,$\texttt L$ 表示华华对手获得一分): $\texttt{WWWWWWWWWWWWWWWWWWWWWWLW}$ 在 $11$ 分制下,此时比赛的结果是华华第一局 $11$ 比 $0$ 获胜,第二局 $11$ 比 $0$ 获胜,正在进行第三局,当前比分 $1$ 比 $1$。而在 $21$ 分制下,此时比赛结果是华华第一局 $21$ 比 $0$ 获胜,正在进行第二局,比分 $2$ 比 $1$。如果一局比赛刚开始,则此时比分为 $0$ 比 $0$。直到分差大于或者等于 $2$,才一局结束。 你的程序就是要对于一系列比赛信息的输入($\texttt{WL}$ 形式),输出正确的结果。 输入格式 每个输入文件包含若干行字符串,字符串有大写的 $\texttt W$ 、 $\texttt L$ 和 $\texttt E$ 组成。其中 $\texttt E$ 表示比赛信息结束,程序应该忽略 $\texttt E$ 之后的所有内容。 输出格式 输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是 $11$ 分制下的结果,第二部分是 $21$ 分制下的结果,两部分之间由一个空行分隔。 ...

December 9, 2022 · 1 min · Red

Echo战队第6次培训——SQL注入方法及其原理1

SQL注入之数据库概述 数据库就是一个存储数据的仓库,数据库是以一定方式存储在一起,能与多个用户共享,具有尽可能小的冗余,与应用程序彼此独立的数据集合。 关系型数据库 关系型数据库,存储的格式可以直观地反映实体间的关系,和常见的表格比较相似 关系型数据库中表与表之间有很多复杂的关联关系的 常见的关系型数据库有MySQL,Orcale,PostgreSQL , SQL Server等。 非关系型数据库 随着近些年技术方向的不断扩展,大量的NoSQL数据库如 Mon goDB,Redis出于简化数据库结构,避免冗余,影响性能的表连接。摒弃复杂分布式的目的被设计 NoSQL数据库适合追求速度和可扩展性,业务多变的场景 数据库排行:https://db-engines.com/en/ranking 数据库服务器层级关系: 服务器里面 :多个数据库 :多个数据表 :多个行 列 字段 : 数据 SQL语句语法回顾: 查询当前数据库服务器所有的数据库 show databases; 选中某个数据库 use 数据库名字 test 查询当前数据库所有的表 show tables; 查询t1表所有数据 查询关键 select * 所有 from 表名 select * from t1; 条件查询 id=2 where 条件 编程 if(条件 true){执行} select * from t1 where id=2; 查询id=2 pass =111 union 合并查询 2个特性: 前面查询的语句 和 后面的查询语句 结果互不干扰! 前面的查询语句的字段数量 和 后面的查询语句字段数量 要一致 * == 3 select id from t1 where id=-1 union select * from t1 where pass =111; order by 排序 order by 字段名字 id 也可以 跟上数字 1 2 3 4 .。。。。。 猜解表的列数 知道表有几列

December 4, 2022 · 1 min · Red

Echo战队第6次培训——SQL注入方法及其原理2

SQL注入之MYSQL手工注入 本章节重点在于熟悉注入流程,以及注入原理。练习靶场为sqli-labs第二关数字型注入。 sqli-labs数字型注入 在url中输入id值,执行查询sql语句。即可得到对应数据 less-2源码分析: 浏览器 进行数据提交 服务器 : get 提交 : url 数据长度 速度快 用于: post 提交 : 服务器 安全性 数据量 注入流程 注入语句 尝试手工注入: SQL注入: 1.判断有无注入点 and 1 = 1; true 随便输入内容 == 报错 注入 == 没有注入 2.猜解列名数量 order by %20 空格 字段 4个 3.报错,判断回显点 union 4.信息收集 数据库版本 version() 高版本:5.0 系统库: information 。。。 数据库名称:database() 低版本:5.0 5.使用对应SQL进行注入 数据库库名:security . 下一级 information_schema.tables 查找表名 table_name 查询security库下面 所有的表名 database() = 前后 连到一起 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() 表: users 如何查询表里面有那些字段? user 字符 转行 16进制 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' username password 字段数据 select username,password from users union select 1,2,(select group_concat(username,:,password)from users)

December 4, 2022 · 1 min · Red

Echo战队第7次培训——SQL注入方法及其原理3

SQL注入之数据提交方式 GET方式注入 get注入方式比较常见,主要是通过url中传输数据到后台,带入到数据库中去执行,可利用联合注入方式直接注入 POST方式注入 post提交方式主要适用于表单的提交,用于登录框的注入 方法:利用BurpSuite抓包进行重放修改内容进行,和get差别是需要借助抓包工具进行测试,返回结果主要为代码,也可转化为网页显示 Request方式注入 概念:超全局变量 PHP中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可以用,这些超全局变量是: $_REQUEST(获取GET/POST/COOKIE)COOKIE在新版本已经无法获取了 $_POST(获取POST传参) $_GET(获取GET传参) $_COOKIE(获取COOKIE传参) $_SERVER(包含了诸如头部信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组) HTTP头注入 什么是Header头? 通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机响应消息。 这两种类型的消息有一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。 HTTP的头域包括通用头,请求头,响应头和实体头四个部分 什么是Header头部注入? header注入,该注入是指利用后端验证客户端信息(比如常用的cookie验证)或者通过header中获取客户端的一些信息(比如User-Agent用户代理等其他header字段信息),因为这些信息在某些地方是会和其他信息一起存储到数据库中,然后再在前台显示出来,又因为后台没有经过相对应的信息处理所以构成了sql注入。 SQL注入之数据类型 (1)数字型注入点 许多网页链接有类似的结构 http://xxx.com/users.php?id=1 基于此种形式的注入,一般被叫做数字型注入点,缘由是其注入点 id 类型为数字,在大多数的网页中,诸如 查看用户个人信息,查看文章等,大都会使用这种形式的结构传递id等信息,交给后端,查询出数据库中对应的信息,返回给前台。这一类的 SQL 语句原型大概为 select * from 表名 where id=1 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where id=1 and 1=1 (2)字符型注入点 网页链接有类似的结构 http://xxx.com/users.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin' 值得注意的是这里相比于数字型注入类型的sql语句原型多了引号,可以是单引号或者是双引号。若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where name='admin' and 1=1 ' 我们需要将这些烦人的引号给处理掉。 (3)搜索型注入点 这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有 "keyword=关键字" 有的不显示在的链接地址里面,而是直接通过搜索框表单提交。此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%' 若存在注入,我们可以构造出类似与如下的sql注入语句进行爆破:select * from 表名 where 字段 like '%测试%' and '%1%'='%1%' ...

December 4, 2022 · 1 min · Red