搜索
无
DJL_DJL_DJL
程序是我的生命,但我相信爱她甚过爱我的生命。
展开
-
Acwing_175电路维修【双端队列+宽搜】
题目链接:Acwing_175电路维修思路分析:双端队列+广度优先搜索首先把电路板上每一个格子点(交叉点)看作无向图中的节点,我们认为两个节点x和y是某个小方格的两个对角,那么如果说x和y的线段’’,那么我们可以认为边权为0,反之如果x和y线段是’/’,那么我们的边权视为1,说明要旋转一次才能够连上.现在我们得到了一张完美的边权0或1的无向图,那么和普通广搜一样,我们唯一的改变就是,如果说当前新状态的边权为0,那么我们就放到队头先走,因为我们要满足两端性和单调性,而为了这个单调性,如果说当前新状态原创 2021-08-27 20:45:04 · 86 阅读 · 0 评论 -
n皇后(Java)(dfs+回溯)
问题描述:八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(斜率为1),问有多少种摆法。高斯认为有76种方案。让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:题解:public class Practice_n皇后问题 { static int n;//表示列数,行数 stat原创 2021-07-20 11:32:08 · 84 阅读 · 0 评论 -
部分和(Java)(dfs+回溯算法)
解法一:import java.util.ArrayList;import java.util.Scanner;public class Practice_部分和 { static void dfs(int[] a, int k, int cur, ArrayList<Integer> res) { if (k == 0) { System.out.println("Yes"); for (int i = 0; ..原创 2021-07-19 16:11:39 · 143 阅读 · 0 评论 -
数独游戏(Java)(dfs+回溯算法)
题目描述:你一定听说过“数独”游戏。如下图所示,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。原创 2021-07-19 15:12:28 · 298 阅读 · 0 评论 -
油田 UVA - 572(DFS解法+BFS解法)
题目链接: 油田.分析与思考:DFS解法: 从每个"@“格子除法,递归遍历它周围的”@"格子。每访问一个格子时,就给它写上一个“连通分量编号”(即下面的idx数组),这样就可以在访问之前检查它是否已经有了编号,从而避免同一个格子访问多次。BFS解法: 思路与DFS解法类似,不过是把递归调用原创 2021-05-04 20:46:10 · 145 阅读 · 0 评论 -
困难的串(Java)(dfs+回溯)
题目描述:如果一个字符串包含两个相邻的重复子串,则称它是“容易的串”,其他串称为“困难的串”。例如, BB、ABCDABCD都是容易的串,而D、DC、ABDAD、CBABCBA都是困难的串。输入正整数n和L,输出由前L个字符组成的、字典序第n个困难的串。例如,当L=3时,前7个困难的串 分别为A、AB、ABA、ABAC、ABACA、ABACAB、ABACABA。输入保证答案不超过80个字符。样例输入:7 3样例输出:ABACABA题解:public class Practice_困难的串 {原创 2021-07-20 11:44:21 · 301 阅读 · 0 评论 -
素数环(Java)(dfs+回溯)
问题描述:题解:import java.util.Scanner;public class Practice_素数环 { //判断是否为素数 static boolean isPrime(int num) { for (int i = 2; i * i <= num; i++) { if (num % i == 0) return false; } return true; } stati原创 2021-07-20 11:52:48 · 324 阅读 · 0 评论 -
PTA-还原二叉树(dfs)
输入样例:9ABDFGHIECFDHGIBEAC输出样例:5AC代码:#include<iostream>using namespace std;int dfs(char a[], char b[], int n) { if (n == 0) return 0; int i; for (i = 0; i < n; i++) { if (a[0] == b[i]) break; } int x = dfs(a + 1, b, i)+1;//递归求左子..原创 2021-08-05 22:07:07 · 624 阅读 · 0 评论 -
水洼数(Java)(dfs)
题解:import java.util.Scanner;public class Practice_水洼数 { static Scanner in = new Scanner(System.in); static int N; static int M; public static void main(String[] args) { N = in.nextInt(); M = in.nextInt(); char[].原创 2021-07-20 09:25:08 · 138 阅读 · 0 评论 -
Acwing_180排书【IDA*】
题目链接:(Acwing_180排书)[https://www.acwing.com/problem/content/description/182/]AC代码://IDA*#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N = 15;int n;int q[N], w[5]原创 2021-08-15 11:18:50 · 75 阅读 · 0 评论 -
Acwing_170加成序列【迭代加深】
题目链接:Acwing_170加成序列搜索框架: 依次搜索序列中的每个位置k,枚举i和 j 作为分支,把X[i]和 X[j]的和填写到x[k]上,然后递归填写下一个位置加入以下剪枝:优化搜索顺序为了让序列中的数尽快逼近n,在枚举i 和j 时从大到小枚举。排除等效冗余对于不同的i和 j,X[i]+X[]可能是相等的。我们可以在枚举时用一个bool数组对X[i]+X[j]进行判重,避免重复搜索某一个和。经过观察分析可以发现,m 的值(序列长度)不会太大(≤10),而每次枚举两个数的和,分支很多原创 2021-08-15 10:51:56 · 89 阅读 · 0 评论 -
Acwing_171送礼物 【双向DFS】
题目链接: Acwing_171送礼物这个题目不可以简单地进行暴力搜索,因为N比较大,需要进行双向DFS搜索思想思路分析:首先,我们搜索出从前一半礼物中选出若干个,可能达到的0~W之间的所有重量值,存放在一个数组A中,并对数组A进行排序、去重。然后,我们进行第二次搜索,尝试从后一半礼物中选出一些。对于每个可能达到的重量值t,在第一部分得到的数组A中二分查找≤w -t 的数值中最大的一个,用二者的和更新答案。这个算法的时间复杂度就只有o(2^N/2 *log2^N/2)= o(N *2^N/2)了原创 2021-08-15 10:46:50 · 102 阅读 · 0 评论 -
Acwing_166数独【DFS之剪枝优化】
题目链接:Acwing_166数独AC代码:#include <iostream>#define lowbit(x) (x & -x) // lowbit操作#define get(x, y) (row[x] & col[y] & cell[x / 3][y / 3]) // get(x, y) 找到该位置可以填哪些数的状态using namespace std;const int N = 9, M = 1 << N;int one[M]原创 2021-08-14 22:40:40 · 115 阅读 · 0 评论 -
Acwing_165小猫爬山 【DFS之剪枝优化】
题目链接:Acwing_165小猫爬山这个题目来源于<<算法竞赛进阶指南>>这本书上,这本书很好哟AC代码:#include <iostream>#include<cstring>#include<algorithm>using namespace std;const int N = 20;int n, m, a[N], ans, sum[N];bool cmp(int a, int b){ return a > b;原创 2021-08-14 22:38:47 · 123 阅读 · 0 评论 -
Acwing_1118分成互质组【DFS之搜索顺序】
这一题直接用的暴力搜索,考虑优化的话可以学习一下最大团算法来进行优化AC代码:#include <iostream>using namespace std;int n;int p[N]; // 存数int group[N][N]; // 最多可能有N个组, 每个组可能有N个数 存的是数的序号(保证可以连续性访问)bool st[N];int res = N; // 组数的最大值是n个数两两互质int gcd (int a, int b){ return b ?.原创 2021-08-14 17:20:29 · 82 阅读 · 0 评论 -
Acwing_1117单词接龙【DFS之搜索顺序】
题目描述:输入样例:5attouchcheatchoosetacta输出样例:23AC代码:#include<string>#include<iostream>#include<algorithm>using namespace std;const int N = 21;int n;string word[N];//存放单词int g[N][N];//记录每两个单词之间是否有边int used[N];//记录每个单词原创 2021-08-14 16:44:28 · 62 阅读 · 0 评论 -
Acwing_1116马走日【DFS之搜索顺序】
输入样例:15 4 0 0输出样例:32题目思路比较简单,就是简单地枚举一下状态就可以了,因为是外部搜索,每个部分的状态改变了,所以需要恢复现场#include<iostream>#include<cstdio>using namespace std;bool st[10][10];int dx[8] = { 2,2,1,-1,-2,-2,-1,1 }, dy[8] = { 1,-1,-2,-2,-1,1,2,2 };int n,m, x, y;in..原创 2021-08-14 16:00:35 · 87 阅读 · 0 评论 -
Acwing_1112迷宫 【DFS之连通性模型】
题目描述:输入样例:23.##…##…0 0 2 25…###.#…#…###……#.0 0 4 0输出样例:YESNOAC代码:#include<iostream>#include<cstring>using namespace std;const int N = 105;char g[N][N];bool st[N][N];int k, n, ax, ay, bx, by;int dx[4] = { -1,0,原创 2021-08-14 15:25:04 · 65 阅读 · 0 评论 -
Acwing_179八数码【A*算法】
题目链接:Acwing_179八数码代码片段里有详细注释,其中具体的算法含义请参考OI WiKi这个网站AC代码:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>#include<cmath>#include<queue>#include<unordered_map>#原创 2021-08-14 11:08:41 · 65 阅读 · 0 评论 -
Acwing_190字符串变换【双向广搜】
题目链接:Acwing_190字符串变换AC代码://双向广搜#include<iostream>#include<algorithm>#include<string>#include<unordered_map>#include<queue>using namespace std;const int N = 6;int n;string a[N], b[N];//存储从a[i]->b[j]每一步的扩展状态int原创 2021-08-13 21:09:39 · 81 阅读 · 0 评论 -
Acwing_843n皇后 【dfs】
输入样例:4输出样例:.Q……QQ……Q.…Q.Q……Q.Q…AC代码://n皇后#include<iostream>using namespace std;const int N = 20;int n;char g[N][N];bool col[N],dg[N],udg[N],row[N];//枚举每一个格点void dfs(int x,int y,int s) { if (y == n) { y = 0; x++; } i.原创 2021-08-13 08:47:04 · 42 阅读 · 0 评论 -
【DFS】
全排列代码//全排列#include<iostream>using namespace std;const int N = 100;int n;bool st[N];int path[N];void dfs(int u) { if (u == n) { for (int i = 0; i < n; i++) printf("%d", path[i]); printf("\n"); } for (int i = 1; i <= n; i++) { if原创 2021-08-12 19:15:34 · 74 阅读 · 0 评论 -
Acwing_173矩阵距离 【多源BFS】
题目链接:Acwing_173矩阵距离涉及算法:多源BFSAC代码:#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;#define x first#define y secondtypedef pair<int, int> PII;const int N = 1001, M = N * N;原创 2021-08-12 10:44:47 · 80 阅读 · 0 评论 -
acwing1097池塘计数 【Flood Fill算法】
题目描述:农夫约翰有一片 N∗M 的矩形土地。最近,由于降雨的原因,部分土地被水淹没了。现在用一个字符矩阵来表示他的土地。每个单元格内,如果包含雨水,则用”W”表示,如果不含雨水,则用”.”表示。现在,约翰想知道他的土地中形成了多少片池塘。每组相连的积水单元格集合可以看作是一片池塘。每个单元格视为与其上、下、左、右、左上、右上、左下、右下八个邻近单元格相连。请你输出共有多少片池塘,即矩阵中共有多少片相连的”W”块。输入格式第一行包含两个整数 N 和 M。接下来 N 行,每行包含 M .原创 2021-08-06 09:55:14 · 79 阅读 · 0 评论 -
Acwing_1076迷宫问题 【最短路模型】
输入样例:50 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0输出样例:0 01 02 02 12 22 32 43 44 4AC代码:#include<iostream>#include<algorithm>#include<cstring>#define x first#define y secondusing namespace std;typedef pair<..原创 2021-08-06 15:48:04 · 114 阅读 · 0 评论 -
Acwing_1100抓住那头牛【广度优先搜索】
1.题目农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点 N,牛位于点 K。农夫有两种移动方式:从 X 移动到 X−1 或 X+1,每次移动花费一分钟从 X 移动到 2∗X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?输入格式共一行,包含两个整数N和K。输出格式输出一个整数,表示抓到牛所花费的最少时间。数据范围0≤N,K≤105输入样例:5 17输出样例:4AC代码:#include<iostr原创 2021-08-07 08:22:47 · 73 阅读 · 0 评论 -
Acwing_1106山峰和山谷 【Flood Fill算法】
输入格式:第一行包含一个正整数 n,表示地图的大小。接下来一个 n×n 的矩阵,表示地图上每个格子的高度 w。输出格式:共一行,包含两个整数,表示山峰和山谷的数量。数据范围1≤n≤10000≤w≤109输入样例:58 8 8 7 77 7 8 8 77 7 7 7 77 8 8 7 87 8 8 8 8输出样例:2 1AC代码:#include<iostream>#include<cstdio>#include<algorithm.原创 2021-08-06 11:57:41 · 146 阅读 · 0 评论