DFS模板

POJ2488

http://poj.org/problem?id=2488

注意字典序。

 1  1 #include<iostream>
 2  2 #include<cstdio>
 3  3 #include<cstring>
 4  4 #include<algorithm>
 5  5 using namespace std;
 6  6 int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};
 7  7 int map[100][100];
 8  8 char a[200];
 9  9 int p,q,flag;
10 10 int check(int x,int y)                          // 边界条件和约束条件的判断
11 11 {
12 12     if(!map[x][y]&&x<=p&&x>0&&y<=q&&y>0)
13 13     return 1;
14 14     return 0;
15 15 }
16 16 void dfs(int x,int y,int s)
17 17 {
18 18     if(s==p*q&&!flag)                                // 出现目标态G
19 19     {
20 20         for(int j=0;j<s*2;j++)
21 21         printf("%c",a[j]);
22 22         printf("\n\n");
23 23         flag=1;                                    //标记,非常重要。
24 24         return;
25 25     }
26 26     for(int i=0;i<8&&!flag;i++)
27 27     {
28 28         int n=x+dir[i][0];int m=y+dir[i][1];      // 按照规则生成下一个节点,注意必须重新定义变量
29 29         if(check(n,m))
30 30         {
31 31             map[n][m]=1;
32 32             a[2*s]=‘A‘+n-1;
33 33             a[2*s+1]=m+‘0‘;
34 34         dfs(n,m,s+1);
35 35         map[n][m]=0;
36 36         }
37 37 }
38 38 }
39 39 main()
40 40 {
41 41     int t,cas=1;
42 42     scanf("%d",&t);
43 43     while(t--)
44 44     {
45 45         scanf("%d%d",&q,&p);
46 46         printf("Scenario #%d:\n",cas++);
47 47         memset(map,0,sizeof(map));
48 48         flag=0;
49 49         map[1][1]=1;
50 50         a[0]=‘A‘;a[1]=‘1‘;
51 51         dfs(1,1,1);
52 52         if(!flag)
53 53         printf("impossible\n\n");
54 54     }
55 55 }
时间: 2024-10-21 18:37:43

DFS模板的相关文章

匈牙利算法dfs模板 [二分图][二分图最大匹配]

最近学了二分图最大匹配,bfs模板却死活打不出来?我可能学了假的bfs 于是用到了dfs模板 寻找二分图最大匹配的算法是匈牙利算法 匈牙利算法的主要程序是寻找增广路 寻找增光路是过程是:从一个未经配对的点出发,历经未配边.匹配边.未配边.匹配边.未配边....最终到达一个未配点的过程,只要把路径中的未配边和匹配边的“身份”对调,匹配就加一了.这就是一个寻找增广路的过程,通过不断寻找增广路,可以找到最大的匹配. 1 #include<cstdio> 2 #include<cstring&g

POJ 1655.Balancing Act-树的重心(DFS) 模板(vector存图)

Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17497   Accepted: 7398 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a forest: a collection of one or m

hdu 1241Oil Deposits(dfs模板)

题目链接—— http://acm.hdu.edu.cn/showproblem.php?pid=1241 首先给出一个n*m的字符矩阵,‘*’表示空地,‘@’表示油井.问在这个矩阵中有多少组油井区? 每个点周围的8个点都可以与之相连. 从左上角的点开始向后枚举然后dfs搜索就可以了.记得记忆化. 废话说完,上代码—— 1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <a

二分图最大匹配(匈牙利算法Dfs模板)

#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using namespace std; int n,m,g[maxn][maxn],ans,f[maxn],match[maxn]; int init() { int x=0;char s;s=getchar(); while(s<'0'||s>'9')s=getchar(); while(s>='0'&am

dfs模板 二部图的最大匹配

/**************************************************** 二分图匹配(匈牙利算法的DFS实现) INIT:g[][]两边定点划分的情况 CALL:res=hungary();输出最大匹配数 优点:适于稠密图,DFS找增广路快,实现简洁易于理解 时间复杂度:O(VE); 适用范围: 二分图的 最小顶点覆盖 ==== 最大匹配 DAG图的 最小路径覆盖数 == 节点数 – 最大匹配数 二分图的 最大独立集数 = 节点数 – 最大匹配数 *******

BFS DFS 模板

/* 该 DFS 框架以 2D 坐标范围为例,来体现 DFS 算法的实现思想. */ #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; const int maxn=100; bool vst[maxn][maxn]; //访问标记 int map[maxn][maxn]; //坐标范围 int dir[4][2]= {0,1,0,-1,1,0,-1,0}; // 方向向量

【dfs模板】dfs找联通块分区

题目描述 天文学家Doctor博士发明了一种太空分区方法,在这个方法中,宇宙里亮度相近的区域被划为同一个星区.空间中相邻两区域若亮度差不大于给定整数M,则这两区域属于同一星区.现给你一个空间的三维坐标图,每个坐标整点表示一个区域,其值表示其亮度,而其上.下.左.右.前.后六个区域被认为是与其相邻的.请你计算一下该空间内的星区数量. 输入 第一行三个正整数x.y.z(x.y.z<=50),表示空间的长宽高.第二行一个整数M.接下来为一行,x*y*z个0~255的整数,按照空间坐标大小的顺序由小到大

【dfs模板】找起点到终点的所有可能路径

题目描述 设有一个N*N(2≤N≤10)方格的迷宫,入口和出口分别在左上角和右上角.迷宫格子中分别放有0和1,0表示可通,1表示不能,迷宫走的规则如下图所示:即从某点开始,有八个方向可走,前进方格中数字为0时表示可通过,为1时表示不可通过,要另找路径. 输入 第一行一个正整数N,表示N*N的迷宫.接下来N行,为一个N*N矩阵. 输出 一行一个正整数,表示路径总数. #include <bits/stdc++.h> #define ll long long using namespace std

Poj1426 DFS模板题

Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51502   Accepted: 21541   Special Judge 题目链接:http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find out a nonzero multiple m of n w