格子

蓝桥杯-python 历届试题 合根植物

拈花ヽ惹草 提交于 2020-03-04 04:19:25
问题描述 w星球的一个种植园,被分成 m * n 个小格子(东西方向m行,南北方向n列)。每个格子里种了一株合根植物。   这种植物有个特点,它的根可能会沿着南北或东西方向伸展,从而与另一个格子的植物合成为一体。 如果我们告诉你哪些小格子间出现了连根现象,你能说出这个园中一共有多少株合根植物吗? 输入格式   第一行,两个整数m,n,用空格分开,表示格子的行数、列数(1<m,n<1000)。   接下来一行,一个整数k,表示下面还有k行数据(0<k<100000)   接下来k行,第行两个整数a,b,表示编号为a的小格子和编号为b的小格子合根了。 格子的编号一行一行,从上到下,从左到右编号。   比如:5 * 4 的小格子,编号:   1 2 3 4   5 6 7 8   9 10 11 12   13 14 15 16   17 18 19 20 样例输入 5 4 16 2 3 1 5 5 9 4 8 7 8 9 10 10 11 11 12 10 14 12 16 14 18 17 18 15 19 19 20 9 13 13 17 样例输出 5 代码如下: def Find_sum ( plant , tup , Sum ) : for tu in tup : t_1 = findroot ( tu [ 0 ] ) t_2 = findroot ( tu [ 1 ] )

Gerald and Giant Chess

谁都会走 提交于 2020-02-24 20:09:29
Gerald and Giant Chess 给你一个 \(n\times m\) 的网格图,有t个棋子被标记成黑色,第i个黑色格子记做 \((x_i,y_i)\) ,其余白色,现在询问在只能向下走或向右走的前提下,从 \((1,1)\) 到 \((n,m)\) 的不经过黑色格子的路径条数, \(n,m\leq 10^5,p\leq 2000\) 。 解 显然不会以传统做法,在哪一个格子为状态,突破点在只有2000个黑色格子,自然考虑补集思想。 为了递推的无后效性,我们把黑色格子按行再列优先的顺序从小到大排序,接着考虑构造不合法状态,于是设 \(f_i\) 表示以第i个黑色格子结尾的路径条数,因此转移为 \[f_i=\sum_{j=1}^{i-1} f_j\times C_{x_i+y_i-x_j-y_j}^{x_i-x_j}\] 答案: \(\sum_{i=1}^tf_i\times C_{n+m-x_i-y_i}^{n-x_i}\) 但是这样的方程是存在重复,于是需要特殊化划分去重,这里考虑限定一个不合法的方法(简称限一),于是设 \(f_i\) 表示只经过i这个黑色格子,以i结尾的路径条数,所以就有转移 \[f_i=C_{x_i+y_i-2}^{x_i-1}-\sum_{j=1}^{i-1}f_j\times C_{x_i+y_i-x_j-y_j}^{x_i-y_i}\]

山峰和山谷-bfs-武汉加油

╄→гoц情女王★ 提交于 2020-02-21 05:18:04
FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。为了能够对旅程有一个安排,他想知道山峰和山谷的数量。给定一个地图,为FGD想要旅行的区域,地图被分为 n×nn×n 的网格,每个格子 (i,j)(i,j) 的高度 w(i,j)w(i,j) 是给定的。若两个格子有公共顶点,那么它们就是相邻的格子,如与 (i,j)(i,j) 相邻的格子有(i−1,j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1)(i−1,j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1) 。我们定义一个格子的集合 SS 为山峰(山谷)当且仅当:SS 的所有格子都有相同的高度。SS 的所有格子都连通。对于 ss 属于 SS ,与 ss 相邻的 s′s′ 不属于 SS ,都有 ws>ws′ws>ws′ (山峰),或者 ws<ws′ws<ws′ (山谷)。如果周围不存在相邻区域,则同时将其视为山峰和山谷。你的任务是,对于给定的地图,求出山峰和山谷的数量,如果所有格子都有相同的高度,那么整个地图即是山峰,又是山谷。输入格式第一行包含一个正整数 nn ,表示地图的大小。接下来一个 n×nn×n 的矩阵,表示地图上每个格子的高度 ww 。输出格式共一行

BFS_FloodFill模型_山峰和山谷(POI2007)

独自空忆成欢 提交于 2020-02-17 16:11:16
历时两周半左右的动态规划集中学习告一段落,后面会继续补充动态规划相关题目题解和想法。 今天开始学习搜索。 宽度(广度)优先搜索的第一个经典模型—— Flood Fill ,实际上就是 通过BFS在一张图中寻找连通块 的模型。 题目 :FGD小朋友特别喜欢爬山,在爬山的时候他就在研究山峰和山谷。 为了能够对旅程有一个安排,他想知道山峰和山谷的数量。 给定一个地图,为FGD想要旅行的区域,地图被分为 n × n n×n n × n 的网格,每个格子 ( i , j ) (i,j) ( i , j ) 的高度 w ( i , j ) w(i,j) w ( i , j ) 是给定的。 若两个格子有公共顶点,那么它们就是相邻的格子,如与 ( i , j ) (i,j) ( i , j ) 相邻的格子有 ( i − 1 , j − 1 ) , ( i − 1 , j ) , ( i − 1 , j + 1 ) , ( i , j − 1 ) , ( i , j + 1 ) , ( i + 1 , j − 1 ) , ( i + 1 , j ) , ( i + 1 , j + 1 ) (i−1,j−1),(i−1,j),(i−1,j+1),(i,j−1),(i,j+1),(i+1,j−1),(i+1,j),(i+1,j+1) ( i − 1 , j − 1 ) , ( i − 1 , j ) ,

2020寒假【gmoj1732】【count】

余生颓废 提交于 2020-02-05 01:01:22
题目描述 小x开发了一个奇怪的游戏,这个游戏的是这样的:一个长方形,被分成 N 行 M 列的格子,第 i 行第 j 列的格子记为 (i, j),就是说,左上角的格子是 (1, 1),右下角的格子是 (N, M)。开始的时候,小y在 (1, 1),他需要走到 (N, M)。每一步,小y可以走到正右方或者正下方的一个格子。具体地说,如小y现在在 (x, y),那么他可以走到 (x, y + 1) 或 (x + 1, y)。当然,小y不能走出离开这个长方形。 每个格子有积分,用一个 1~10 的整数表示。经过这个格子,就会获取这个格子的积分(起点和终 点的积分也计算)。通过的方法是:到达 (N, M) 的时候,积分恰好为 P 。 现在给出这个长方形每个格子的积分,你需要帮助小y,求出从起点走到终点,积分为 P 的线路有多少条。 输入 第 1 行3 个整数 N, M, P 。 接下来 N 行,每行 M 个整数 Aij ,表示格子 (i, j) 的积分。 样例输入 3 3 9 2 2 1 2 2 2 1 2 2 输出 1 行1 个整数,表示积分为 P 线路的数量。 因为数值太大,你只需要输出结果除以 (10^9 + 7) 的 余数。 样例输出 2 分析 这题第一眼看上去是搜索题(我做了好久深搜) 其实不然,这是一道dp(说出来我都不信) 首先,怎么设呢?我们先建一个三维数组d,设d[i][j

习题3-6 UVA232 Crossword Answers(49行AC代码)

Deadly 提交于 2020-02-04 22:21:53
紫书刷题进行中, 题解系列点这里 习题3-6 UVA232 Crossword Answers(49行AC代码) 思路分析 给定N*M的网格,有黑白两种格子,从上到下,从左到右依次对左侧和上侧没有白格子的白格子进行标号,具体如下: 第一行和第一列的白格子均编号 其余行列,若一个白格子的左侧或上侧存在黑格子,则对其进行编号 编号完成后,分别按行和按列输出相应子串,子串以有编号的白格子开始,遇见黑格子或行列则结束。 因此,可用 string数组 存放网格,一遍扫描后计算出存在编号的白格子 按行遍历输出即可完成按行输出子串 按列遍历则需将子串先存放与哈希数组,最后再按顺序输出 注意点 输出标号格式:右对齐,宽度为3,即 printf("%3d",..) 两个相邻puzzle间需多输出一个空行,最后一个puzzle不需要 当puzzle的行或列为空时,一样得输出 Across Down AC代码(C++11,字符串处理,坑人输出) # include <bits/stdc++.h> using namespace std ; # define MAXN 11 string puzzle [ MAXN ] ; int n , m , cnt = 0 , num = 0 , now , id [ MAXN ] [ MAXN ] = { 0 } ; // 编号 int main ( ) {

剑指offer-12. 矩阵中的路径

跟風遠走 提交于 2020-01-31 00:13:54
判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向上下左右移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 public class Solution { private int [ ] [ ] next = { { 0 , 1 } , { 0 , - 1 } , { 1 , 0 } , { - 1 , 0 } } ; private int rows ; private int cols ; public boolean hasPath ( char [ ] matrix , int rows , int cols , char [ ] str ) { this . rows = rows ; this . cols = cols ; char [ ] [ ] matArr = getMatrix ( matrix ) ; boolean [ ] [ ] markarr = new boolean [ rows ] [ cols ] ; for ( int i = 0 ; i < rows ; i ++ ) { for ( int j = 0 ; j < cols ; j ++ ) { if ( backTracking ( matArr , 0 , i , j , str ,

HDU 2819 Swap(二分图匹配)

ぃ、小莉子 提交于 2020-01-24 14:14:49
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=2819 【题目大意】   给出一个棋盘,由白格子和黑格子组成,可以交换棋盘的行列,   使得其主对角线为黑格子,其余均为白格子,问是否能达成,   如果能达成输出交换步骤,否则输出-1 【题解】   我们对于所有的黑格子将其从属的行标和列标相连,做一遍二分图匹配,   对于每一行拥有的黑块如果不是在对应的列,我们就将这一行和对应的行互换, 【代码】 #include <cstdio> #include <algorithm> #include <cstring> #include <vector> using namespace std; const int MAX_V=2000; int V,match[MAX_V]; vector<int> G[MAX_V]; bool used[MAX_V]; void add_edge(int u,int v){ G[u].push_back(v); G[v].push_back(u); } bool dfs(int v){ used[v]=1; for(int i=0;i<G[v].size();i++){ int u=G[v][i],w=match[u]; if(w<0||!used[w]&&dfs(w)){ match[v]=u;

队列之连通块

為{幸葍}努か 提交于 2020-01-19 01:46:56
[问题描述] 一个n m的方格图,一些格子被涂成了黑色,在方格图中被标为1,白色格子标为0.问有多少个四连通的黑色格子连通块。 四连通的黑色格子连通块指的是一片由黑色格子组成区域,其中的每个黑色格子能通过四连通的走法(上下左右),只走黑色格子,到达该联通块中的其它黑色格子。 [输入] 第一行两个整数n,m(1<=n,m<=100),表示一个n m的方格图. 接下来n行,每行m个整数,分别为0或1,表示这个格子是黑色还是白色。 [输出] 只有一行,一个整数ans,表示图中有ans个黑色格子连通块. int a[110][110],q[110][2];//a数组存储所输入的黑格子,这里定义为全局方便直接函数调用 int n,m; int flag[4][2]={{0,1},{0,-1},{1,0},{-1,0}};//相邻的四个黑格子 bool p[110][110];//p数组用来判断这个黑格子是否被搜索过 void bfs(int x,int y) { int front=0,rear=2; q[1][0]=x;//将新搜索到的点保存到q数组 q[1][1]=y; while(front<rear-1)//front为队头,rear为队尾 { front++; x=q[front][0]; y=q[front][1]; for(int i=0;i<4;i++) { int x1=x