方格

蓝桥杯:方格填数

谁说胖子不能爱 提交于 2020-03-17 07:33:55
如下的10个格子 填入0~9的数字。 要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 # include <iostream> # include <cmath> using namespace std ; int a [ 10 ] , ans = 0 ; /*暴力检查*/ bool check ( ) { if ( abs ( a [ 0 ] - a [ 1 ] ) == 1 || abs ( a [ 0 ] - a [ 3 ] ) == 1 || abs ( a [ 0 ] - a [ 4 ] ) == 1 || abs ( a [ 0 ] - a [ 5 ] ) == 1 || abs ( a [ 1 ] - a [ 2 ] ) == 1 || abs ( a [ 1 ] - a [ 4 ] ) == 1 || abs ( a [ 1 ] - a [ 5 ] ) == 1 || abs ( a [ 1 ] - a [ 6 ] ) == 1 || abs ( a [ 2 ] - a [ 5 ] ) == 1 || abs ( a [ 2 ] - a [ 6 ] ) == 1 || abs ( a [ 3 ] - a [ 4 ] ) == 1

方格填数 —— dfs

前提是你 提交于 2020-03-03 15:45:33
方格填数 如下的10个格子 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方案? //方格填数 public class Main { static int cnt = 0 ; static boolean [ ] vis = new boolean [ 10 ] ; //标记每个数是否被访问 static int [ ] [ ] table = new int [ 3 ] [ 4 ] ; public static void main ( String [ ] args ) { for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 4 ; j ++ ) { table [ i ] [ j ] = - 2 ; //全部设置为-2 } } for ( int j = 0 ; j < 10 ; j ++ ) { vis [ j ] = false ; } dfs ( table , 0 , 1 ) ; System . out . print ( cnt ) ; } private static void dfs ( int [ ] [ ] table , int i , int j ) { if ( i == 2 && j == 3 ) { cnt ++ ;

仙岛求药

故事扮演 提交于 2020-02-24 15:49:11
少年李逍遥的婶婶病了,王小虎介绍他去一趟仙灵岛,向仙女姐姐要仙丹救婶婶。叛逆但孝顺的李逍遥闯进了仙灵岛,克服了千险万难来到岛的中心,发现仙药摆在了迷阵的深处。迷阵由 M \times NM×N 个方格组成,有的方格内有可以瞬秒李逍遥的怪物,而有的方格内则是安全。现在李逍遥想尽快找到仙药,显然他应避开有怪物的方格,并经过最少的方格,而且那里会有神秘人物等待着他。现在要求你来帮助他实现这个目标。 输入格式 第一行输入两个非零整数 MM 和 NN,两者均不大于 2020。MM 表示迷阵行数, NN 表示迷阵列数。 接下来有 MM 行, 每行包含 NN 个字符,不同字符分别代表不同含义: ‘@’:少年李逍遥所在的位置;2) ‘.’:可以安全通行的方格;3) ‘#’:有怪物的方格;4) ‘*’:仙药所在位置。 输出格式 输出一行,该行包含李逍遥找到仙药需要穿过的最少的方格数目(计数包括初始位置的方块)。如果他不可能找到仙药, 则输出 -1−1。 输出时每行末尾的多余空格,不影响答案正确性 样例输入1 复制 8 8 .@##…# #…#.# #.#.##… …#.###. #.#…#. …###.#. …#. … .#…### 样例输出1 复制 10 样例输入2 复制 6 5 . .#. .#… …##. … .#… …@ 样例输出2 复制 8 样例输入3 复制 9 6 .#…#. .#.*.

方格分割

♀尐吖头ヾ 提交于 2020-02-19 11:55:56
6x6的方格,沿着格子的边线剪开成两部分。 要求这两部分的形状完全相同。 如图:p1.png, p2.png, p3.png 就是可行的分割法。 试计算: 包括这3种分法在内,一共有多少种不同的分割方法。 注意:旋转对称的属于同一种分割法。 解题思路:每一种对称分割,都必然经过正中间的点,关于这个点对称,即(3, 3),以该点为起点,像两个相反方向搜索,直到走到正方形边缘,搜索过程中保证两条搜索路径相反,记录答案,因为这样搜索出来的是所有可能,而一种分割方法可以转换四种方向,所以最后答案还要/4 # include <bits/stdc++.h> using namespace std ; int book [ 10 ] [ 10 ] ; int dire [ 4 ] [ 2 ] = { - 1 , 0 , 1 , 0 , 0 , - 1 , 0 , 1 } ; //这种顺序是保证每次移动都是平行移动(不存在对角线那种移动) const int N = 6 ; int ans ; void dfs ( int x , int y ) { if ( x == 0 || y == N || x == N || y == 0 ) //到达正方形的边缘 { ans ++ ; return ; } //一次涂色完成,情况数+1 for ( int i = 0 ; i < 4 ; i ++ )

迷宫-dfs

久未见 提交于 2020-01-22 00:37:20
题目描述 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 1≤N,M≤5 输入 第一行起点坐标SX,SY,终点坐标FX,FY。 第二行N、M和T,N为行,M为列,T为障碍总数。 接下来T行,每行为障碍点的坐标。 输出 给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。 样例输入 1 1 2 2 2 2 1 1 2 样例输出 1 题解: 巨简单的DFS,模板题,数据也很小 #include <bits/stdc++.h> #define MAXN 20 using namespace std; int rub[MAXN][MAXN]; int vis[MAXN][MAXN]; int n, m, t, bx, by, ex, ey; int ans = 0; int zb[4][2] = {{0,-1},{0,1},{1,0},{-1,0}}; void dfs(int x,int y) { if(x == ex && y == ey) { ans++;return; } else for(int i = 0 ; i < 4; ++i) if(x >= 1 && x <= n

P2701 [USACO5.3]巨大的牛棚Big Barn |动态规划

北战南征 提交于 2019-12-04 10:25:37
题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方。我们假定,他的农场划分成 N x N 的方格。输入数据中包括有树的方格的列表。你的任务是计算并输出,在他的农场中,不需要砍树却能够修建的最大正方形牛棚。牛棚的边必须和水平轴或者垂直轴平行。 EXAMPLE 考虑下面的方格,它表示农夫约翰的农场,‘.'表示没有树的方格,‘#'表示有树的方格 1 2 3 4 5 6 7 8 1 . . . . . . . . 2 . # . . . # . . 3 . . . . . . . . 4 . . . . . . . . 5 . . . . . . . . 6 . . # . . . . . 7 . . . . . . . . 8 . . . . . . . . 最大的牛棚是 5 x 5 的,可以建造在方格右下角的两个位置其中一个。 输入格式 Line 1: 两个整数: N (1 <= N <= 1000),农场的大小,和 T (1 <= T <= 10,000)有树的方格的数量 Lines 2..T+1: 两个整数(1 <= 整数 <= N), 有树格子的横纵坐标 输出格式 只由一行组成,约翰的牛棚的最大边长。 #include<queue> #include<cmath> #include<vector>

骨牌铺方格

匿名 (未验证) 提交于 2019-12-03 00:32:02
Submit Statistic Discuss Problem Description Input Output Sample Input 1 3 2 Sample Output 1 3 2 Hint hdoj2046 Source HDU LCY 简单递推题目,需推出arr[i]=arr[i-1]+arr[i-2]; AC代码 #include <cstdio> #include <iostream> using namespace std; long long arr[100]; int main() { arr[1]=1,arr[2]=2; for(int i=3;i<100;i++) arr[i]=arr[i-1]+arr[i-2]; int n; while(cin>>n) cout<<arr[n]<<endl; return 0; } 文章来源: 骨牌铺方格

NOI 4982:踩方格

匿名 (未验证) 提交于 2019-12-02 23:00:14
题目: 请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。 题解: #include<iostream> using namespace std; int main() { int n,f[21]; cin>>n; f[0]=1; f[1]=3; for(int i=2;i<=n;i++) { f[i]=f[i-1]*2+f[i-2]; } cout<<f[n]; return 0; } 文章来源: NOI 4982:踩方格

Codechef July Challenge 2019 Snake and Apple Tree

五迷三道 提交于 2019-12-01 08:54:57
费用流。 把每个方格拆成 $T$ 个点,$t$ 时刻一个方格向周围四个方格的 $t + 1$ 的点连一条容量为 $1$ 费用为 $0$ 的边,向自身的 $t + 1$ 连一条容量为 $1$ 费用为该方格最大幸福值的边。 源点向方格为 'S' 的0时刻连一条容量为 $1$ 费用为 $0$ 的边。所有点的 $T - 1$ 时刻向汇点连一条容量为 $1$ 费用为该方格最大幸福值的边。 还有每个格子同时刻不能有多条蛇呆在上面,再把每个点每个时刻拆成两个点,容量为 $1$ 费用为 $0$。跑最大费用最大流即可。 #include <bits/stdc++.h> using namespace std; const int N = 300; const int NN = 1e5 + 7, M = 5e5 + 7; const int INF = 0x3f3f3f3f; template<class T> inline void checkmax(T &a, T b) { if (a < b) a = b; } template<class T> inline void checkmin(T &a, T b) { if (a > b) a = b; } struct E { int v, ne, f, c; } e[M]; int head[NN], cnt, tol; int id[N][N]

[分治算法]骨牌铺方格

非 Y 不嫁゛ 提交于 2019-12-01 07:15:01
骨牌铺方格 Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: Input 输入数据由多行组成,每行包含一个整数n,表示该测试实例的长方形方格的规格是2×n (0< n<=50)。 Output 对于每个测试实例,请输出铺放方案的总数,每个实例的输出占一行。 Sample Input 1 3 2 Sample Output 1 3 2 算法思路:分治算法核心就是缩小问题规模,一般有两种缩小思路:二分法/递减法,显然这个问题采用"递减法"比较好。 推算如上图,现在假设需要计算第N个,即把N-1时再添加" 一个竖着的情况 "(因为第N-1个我们把各种情况计算出来了,所以无需操心);但是我们缺少横着的情况,那么再往前推N-2个,再添加一个" 横着的情况 "。 因此得到递推算法 func(n)=func(n-1)+func(n-2)。 至于放在左右问题,因为之前N-1与N-2满足所有情况,左右无关紧要,算作一种(对称)。 源代码: 1 // 算法.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include "pch