
搜索
基础算法
ღ江晚吟a
如果浮生若梦,万事无常,最终都归于尘土,那么也许我们的雄心壮志不过徒然为荒诞不经的玩笑而已。如果我们无可救药地执着于自己的意义,或许也只能安于自身的可笑。
展开
-
DFS入门级(模板)
DFS最近一直都在写蓝桥杯的题目,其中有许多题目涉及到了搜索(DFS,BFS)等,由于递归过于抽象,所以没能很好的掌握。于是便写下了这篇入门教程来加深对DFS的认识,并且充分理解递归。所谓DFS就是指:优先考虑深度,换句话说就是一条路走到黑,直到无路可走的情况下,才会选择回头,然后重新选择一条路。1.全排列(入门引导)引导题:输入一个数n,输出n的全排列可以先把这个问题形象化如:假如有编号为1,2,3的3张扑克牌和编号为1,2,3的3个盒子。将这3张扑克牌分别放入3个盒子一共有几种不同的放原创 2020-08-16 18:09:58 · 119783 阅读 · 111 评论 -
迷宫(蓝桥杯)
思路创建一个结构体,用来存坐标,步数,所走路字典序。创建数组存每步的走法并对应最小的字典序。源码(不知道错哪里)#include<bits/stdc++.h>using namespace std;struct pos{ int x,y,step; string s;};int n,m;int sx=1,sy=1,fx=30,fy=50;int dx[]={1,0,0,-1};int dy[]={0,-1,1,0};char dir[]={'D','L','R',.原创 2021-04-12 18:49:32 · 324 阅读 · 0 评论 -
P1825 [USACO11OPEN]Corn Maze S
链接:P1825 [USACO11OPEN]Corn Maze S思路1.输入地图,寻找起始点2. 起始点入队,扩展3.判断是否找到终点4.判断是否进入穿越点(函数) 源码#include<bits/stdc++.h>using namespace std;const int maxn=350;struct pos{ int x,y,d;};queue<pos> Q;char mp[maxn][maxn];int vis[maxn][maxn],n原创 2021-04-12 15:11:48 · 466 阅读 · 0 评论 -
P1135 奇怪的电梯
DFS#include<bits/stdc++.h>using namespace std;int n,a,b;int k[305],vis[305];int minn=0x7fff;void dfs(int x,int step){ if(step>minn) return ;//剪枝 if(x==b){ //如果找到,则更新最小值 minn=min(step,minn); return ; } for(int i=-1;i<=1;i+=2.原创 2021-04-11 09:09:21 · 179 阅读 · 0 评论 -
P1605 迷宫
思路迷宫问题:注意事项:特别要注意边界(如果从0开始,则往四周走容易越界)错误示范:#include<bits/stdc++.h>using namespace std;//迷宫问题:注意事项:特别要注意边界(如果从0开始,则往四周走容易越界) int n,m,t;int sx,sy,fx,fy;int zx,zy;int dx[]={0,0,-1,1};int dy[]={-1,1,0,0};int mp[10][10],vis[10][10];int an.原创 2021-04-06 17:22:39 · 120 阅读 · 0 评论 -
P1135 奇怪的电梯
思路注意判断每次上下移动是否符合要求。源码#include<bits/stdc++.h>using namespace std;int n,a,b;int k[205],vis[205];int ans=0x7ffffff;void dfs(int now,int step){ if(now==b){ ans=min(step,ans); return ; } if(step>ans){ return ; } if(now+k[now]<.原创 2021-03-30 15:23:36 · 142 阅读 · 0 评论 -
四阶数独
思路 int row=(x-1)/4+1; //设置行 1 2 3 4为第一行 先让x-1 可以确保 设置为 1 int col=(x-1)%4+1; // 设置列 也同理 int block=(row-1)/2*2+(col-1)/2+1; //设置每块 为啥row要*2 因为每两行有两块,则需要扩大两倍 源码#include<bits/stdc++.h>using namespace std;#define size 5int a[size*s.原创 2021-03-29 18:35:41 · 2000 阅读 · 0 评论 -
P2036 [COCI2008-2009#2] PERKET
思路选择调料,然后刷新最小值。注意当酸为1时,苦为0时,可以不选。减少时间复杂度。源码#include<bits/stdc++.h>using namespace std;int a[11],b[11],ans=999999;int n; void dfs(int cnt,int x,int y){ if(cnt>n){ //终止条件,调料选完 if(x==1&&y==0) return ; //可以不选 ans=min(ans.原创 2021-03-19 18:27:52 · 642 阅读 · 0 评论 -
P3654 First Step (ファーストステップ)
思路每行k个或每列k个注意特例k==1时 每个计算了两次源码#include<bits/stdc++.h>using namespace std;char a[1005][1005];int r,c,k;int ans;void dfsr(int x,int y,int r){ if(r==k){ ans++; return ; } if(a[x][y+1]=='.') dfsr(x,y+1,r+1); }void dfsu(int x,int .原创 2021-03-18 20:34:41 · 107 阅读 · 0 评论 -
P2089 烤鸡
思路创建两个来保存数据。源码#include<bits/stdc++.h>using namespace std;int n;int a[11];int ans1,ans2[100000][11]; //ans1方案数,ans2[][]用来存每种方案//用dfs来搜索 void dfs(int cnt,int k){ if(cnt>10){ if(k==n){ //终止条件 ans1++; for(int i=1;i<=10;i++){ .原创 2021-03-17 20:13:07 · 136 阅读 · 0 评论 -
P1228 地毯填补问题(递归+分治)
P1228 地毯填补问题思路其实这道题目一点也不会写,光看懂别人的解题思路就花了好长时间。那现在我来说说我对这个题目的理解。1.所谓拐点就是每种毯子,中间的那块,也就是那个点的坐标。2.可以发现当格子22时,必有一种填充方式。3.由2引申,我们可以把迷宫全部分成22,也就是递归结束的标志。源码#include <cstdio>using namespace std;int n,k,a[1201][1201];//这道题目的思路:找中点,然后判断中点的位置。公主的位置有原创 2021-02-03 20:24:13 · 1900 阅读 · 0 评论 -
P2670 [NOIP2015 普及组] 扫雷游戏
思路首先就是将数据输入,然后有两种解法。1.找非雷区有多少雷并统计。2.找雷区,给其他区域赋值(更简单)。源码#include<bits/stdc++.h>using namespace std;int b[101][101];char a[101][101];int x_[8]={-1,1,0, 0,-1,-1,1,1};int y_[8]={0, 0,-1,1,-1,1,-1,1};int n,m;void dfs(int x,int y){ for(int i.原创 2021-01-27 21:30:16 · 272 阅读 · 0 评论 -
P1596 [USACO10OCT]Lake Counting S(C语言)
P1596 [USACO10OCT]Lake Counting S(C语言)思路首先根据题目要求,输入行和列。之后便将二维数组填充。进入搜索的条件:水坑,也就是a[i][j]=='W',进入搜索,则需要将每个水坑进行标记。这道题:检测连通性源码#include<stdio.h>char a[101][101];int n,m;int sum;void dfs(int x,int y){ int dx,dy; a[x][y]='.'; //标记原创 2020-08-18 00:11:19 · 1464 阅读 · 0 评论 -
P1219 [USACO1.5]八皇后 Checker Challenge(C语言)
P1219 [USACO1.5]八皇后 Checker Challenge1.思路1.1对角线的表示首先根据题目的要求,我们可以用一个数组line[13]表示皇后放置的位置 如line[4]=5 则表示第4行第5列放了一个皇后。然后再分别用ud[13],ld[13]表示上,下对角线看上对角线的图,不难发现处于上对角线的值都是相等的则可以用ud[i+j]来表示,其中i表示第几行,j表示第几列。可能还有一点很难理解,为什么ud[i-j]能表示一条对角线,不就是一个单独的坐标吗?其实很容易想明白了原创 2020-08-17 19:50:23 · 2885 阅读 · 2 评论 -
蓝桥杯省赛真题-剪邮票
剪邮票如【图1.jpg】, 有12张连在一起的12生肖的邮票。现在你要从中剪下5张来,要求必须是连着的。(仅仅连接一个角不算相连)比如,【图2.jpg】,【图3.jpg】中,粉红色所示部分就是合格的剪取。请你计算,一共有多少种不同的剪取方法。请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。1.思路首先把题目分成两部分:1.用全排列12选5个数2.看选择的数是否满足条件1.全排列推荐使用next_permutation,可以去除重复的排原创 2020-08-14 14:27:32 · 9089 阅读 · 12 评论 -
蓝桥杯省赛真题-方格填数
方格填数如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+(如果显示有问题,也可以参看【图1.jpg】)填入0~9的数字。要求:连续的两个数字不能相邻。(左右、上下、对角都算相邻)一共有多少种可能的填数方案?请填写表示方案数目的整数。注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。1.思路(暴力)用全排列,然后再判断每两个原创 2020-08-14 09:45:05 · 3594 阅读 · 3 评论 -
蓝桥杯省赛真题-方格分割
方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。1.思路从中间出发(3,3),向两边走,形成一条切割线。然后因为是旋转体(旋转4次回到起始形状),所以要除以42.源码#include<iostream> using namespa原创 2020-08-11 20:33:51 · 2206 阅读 · 4 评论 -
P1149 火柴棒等式(C语言)
P1149 火柴棒等式1.思路可以用数组存放每个数字要的火材棒的根数,然后用函数分别计算每个数所要的火材棒数目,因为等号和加号个占两个火材棒,则需要减去4因为 0+1111=1111.所消耗的火材棒刚好为,则可以说明每个数的取值范围是0-11112.源码int fun(int x){int num=0;int f[10]={6,2,5,5,4,5,6,3,7,6}; while(x/10!=0) { num+=f[x%10]; x/=10; } num+=f原创 2020-08-01 20:09:56 · 975 阅读 · 0 评论