深搜最基础题---全排列

这个是理解标记和取消标记,用一个vis数组来标记

 1 #include <stdio.h>
 2
 3 int a[100];
 4 int vis[100];
 5 int num;//统计总数
 6 void dfs(int n, int cur)
 7 {
 8     if(n == cur)
 9     {
10         for(int i = 0; i < n; i++)
11             printf("%d ", a[i]);
12         printf("\n");
13         num++;
14         return;
15     }
16     for(int i = 1; i <= n; i++)
17     {
18         if(vis[i] == 0)
19         {
20             vis[i] = 1;//标记
21             a[cur] = i;
22             dfs(n, cur + 1);
23             vis[i] = 0;//取消标记
24         }
25     }
26 }
27 int main()
28 {
29     int n;
30     while(~scanf("%d", &n))
31     {
32         num = 0;
33         dfs(n, 0);
34         printf("sum total: %d\n", num);
35     }
36     return 0;
37 }
时间: 2024-10-14 02:12:49

深搜最基础题---全排列的相关文章

poj1011(深搜+剪枝)

题意:给m根木棍,将它们重新拼成n根一样长的木棍,并使得n尽量大(即每个新木棍尽量短). 解法:经典的搜索题目.从小到大枚举拼成的新木棍长度,每次枚举进行一次深搜.这题关键是如何剪枝. 1.当枚举的长度不能整除总长度的时候,剪枝:(这个很显然) 2.先将木棍从长到短排序,枚举时先尝试长的木棍.(先枚举长的可以使得搜索深度不至于过深) 3.深搜时,不要企图通过换掉一个新木棍的第一根来改变失败的局面(换掉第一根A,那么A也会在以后的新木棍中被使用,但是已经证明了A无法拼成了,所以不必再尝试下去了)

NYOJ 10 skiing (深搜和动归)

skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪. 由于滑雪的确非常刺激.但是为了获得速度.滑的区域必须向下倾斜.并且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑坡.区域由一个二维数组给出.数组的每一个数字代表点的高度.以下是一个样例 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9

HDU 4597 Play Game(记忆化搜索,深搜)

题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的分值.//解题思路:记忆化搜索,状态出来就非常水,dp[fl][fr][sl][sr][flag],//表示第一堆牌上边取到fl,下面取到fr,同样sl,sr为第二堆牌,flag为第几个人在取.//如果是第一个人,dp既要尽量大,如果是第二个人,那么肯定尽量小. http://www.2cto.co

深搜--1-n的全排列

之前被教过一个next_permutation库函数,是用来实现数的全排列的,具体实现见代码 #include<stdio.h> #include<iostream> #include<algorithm> using namespace std; int main(){ int a[1000]; int n; while(scanf("%d",&n)!=EOF){ for(int i=0;i<n;i++) a[i]=i+1; do{

简单的深搜题

/*高中同学问了我一道题,开始以为简单循环就能完成,后来发现原来是道深搜题,一开始还没想出来... 问题描述 给1到N,N个数,要你从中选取M个出来,请输出每一种的选取情况(根据序列字典序输出, 即两个序列比大小,第一位小的小,若相等第二位小的小,若相等第三位小的小--). 样例输入 4 3 样例输出 1 2 3 1 2 4 1 3 4 2 3 4*/ <span style="font-size:18px;">#include<stdio.h> int ans

fzu 1920 Left Mouse Button(简单深搜题)

题目地址:http://acm.fzu.edu.cn/problem.php?pid=1920 题目大意是给定一个n*n的图,模拟扫雷游戏,0代表没有雷区,1代表附近九宫格内只有一个雷-- 如果不懂的话去玩下扫雷,挺好玩的,99个雷的玩了好几百盘才赢了一次............ 此题假设神操作,点不到雷,问你最少要多少下才可以把图中非雷的点完,怎么样才最快呢? 当然先点0啦,,,,,,,, 好吧,不废话了..... ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1

基础深搜小结

目前看来,简单深搜题大致分为三类题型: 1是连通块问题,求连通块大小和数量. 2是迷宫问题,问地图内放几个坐标,有几个放法. 3是输出路径问题. 1.这个问题的经典例题是计算水塘(pku-2386 lake counting) 例题: Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N

西安邀请赛D题 字符串生成题 深搜

很抱歉,学校的OJ并不支持外网,而且还没有加上题目... 题意是说,求一个字符串,他的所有长度超过4的子串都是唯一的. 然后我当时是想aaaa, baaa, caaa, daaa...这样巴拉巴拉一直生成下去的,后来发现真的是想的太天真了,因为前面的两个长度为4的子串("aaaabaaa")的存在,直接封杀了3个子串("aaab", "aaba", "abaa").然后我就想记录状态去试着暴力去跑一个生成机.其实也很简单,就是

hdu1010-Tempter of the Bone DFS深搜入门题+奇偶剪枝

Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 69699    Accepted Submission(s): 19176 Problem Description The doggie found a bone in an ancient maze, which fascinated him a