1到9的全排列(用深搜 语言c++)

c++代码:

#include<bits/stdc++.h>
using namespace std;
#define fo(i,a,b) for(int i=a;i<=b;i++)
bool visit[11];
int a[10];
void dfs(int index)
{
 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);//使c++输出和c一样快
 if(index==10)
 {
  cout<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<a[8]<<a[9]<<endl;
  return;
 }
 fo(i,1,9)
 {
  if(!visit[i])
  {
   visit[i]=true;
   a[index]=i;
   dfs(index+1);
   visit[i]=false;
  }
 }
}
int main()
{
 dfs(1);
 return 0;
}

顺便附带c代码(666):

#include<stdio.h>
int a[10];
bool visit[11];
void dfs(int index)
{
 if(index==10)
 {
  printf("%d%d%d%d%d%d%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
  return;
 }
 for(int i=1;i<=9;i++)
 if(!visit[i])
 {
  visit[i]=true;
  a[index]=i;
  dfs(index+1);
  visit[i]=false;
 }
}
int main()
{
 dfs(1);
 return 0;
}

关于这里dfs里面递归的个人解读:(第一组数据123456789到第二组数据123456798的变化过程)

先看第一组数据,一定是递增的123456789;直接看当index=9后(a1-a9依次赋值为1-9),dfs(index+1/*等于10*/)开始输出123456789,第9层循环也结束了;于是返回的是上一个循环,也就是第8层循环的位子,顺便提带下,此时visit[9]已经再次赋值为false了(从bool定义后为false后,用了变为true,结束使用后重新为false),但visit[1]-visit[7]还是true状态(且此时a1-a7还是被赋值为1-7,index值还是为8,而i值由于结束了第9层循环由8(i++)变为9,由于第8层的i=8的递归结束了,visit[8]也变为false),所以a8被赋予9(因为此时第8层循环是i=9开始的),visit[9]同时变为true状态,接下来又进入第9层循环(i从1开始),但因为此时只有visit[8]为false,故dfs(9)会将a9=8;最后就是dfs(10)输出123456798了;然后visit[7]visit[8]和visit[9]变为false,进入第7层循环,且第7层的i变为8...

/*

visit[i]=true;

...

visit[i]=false;

这里可以理解为,i一旦变换,原来的visit[i]就会变为false;因为在进入visit[i]等于true后,一旦i变化了,就说明这i里的递归结束了,则执行visit[i]=false;再执行i++,这样i才会变化。所以i值变化,则原来的visit[i]一定重新变为false(至少我是这样想的)

*/

原文地址:https://www.cnblogs.com/wwq-19990526/p/8323879.html

时间: 2024-11-10 13:33:00

1到9的全排列(用深搜 语言c++)的相关文章

深搜--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{

深搜和广搜

先说说这个神秘的深搜: 前几天我心中的大牛给我讲了深搜感觉还是挺简单的,可大牛告诉我深搜深搜深的让你不知道怎么搜 我们也是从一道题来看:n的全排列 比如说3的全排列 123 213 321 这就是全排列   在没学过深搜的时候我们会用for循环来做这道题 但是如果n很大的时候就不行了 所以我们就一定要深搜了 其实在我看来深搜和递归是亲兄弟 深搜就是递归的加强版 我先写一个简单的dfs(深搜)函数的代码 #include<stdio.h> int dfs(int x) { if(x > n

(暴力+深搜)POJ - 2718 Smallest Difference

原题链接: http://poj.org/problem?id=2718 题意: 给你几个数字,可以分成两个子集,然后分别按一定顺序排列组成一个数,求出这两只值差的绝对值的最小值. 分析: 反正也是刷着玩,果断先交一波全排列枚举的代码,果断TLE,然后开始想正解. 稍微想想,既然要差最小,肯定是两个数各一半.所以只要深搜出所有n/2(n为给定数字的个数)的组合,另外个n-n/2个数就有了. 但是枚举出来后的操作又想了很久,想过很多算法,都不怎么满意,最终用二分解决. 先把n/2和n-n/2全排列

7.5 深搜-最佳调度问题(枚举排列+回溯+剪枝)

这几天偷了几天懒,今天为大家讲解一篇深搜好题,典型的全排列问题需运用剪枝+回溯来优化运行时间,与上一道都是比较典型的深搜优化问题. 题目描述 假设有n个任务由k个可并行工作的机器完成,完成任务i需要的时间为ti,对任意给定的整数n和k,以及完成任务i需要的时间ti,设计一个算法,求完成这n个任务的最佳调度,使得完成全部任务的时间最早. 输入 第一行有2个正整数n和k,第二行有n个正整数,表示ti n<7000,c<maxlongin 输出 一个整数,输出最早时间 样例输入 7 3 2 14 4

hdu1455 Sticks 深搜 强剪枝

Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6035    Accepted Submission(s): 1704 Problem Description George took sticks of the same length and cut them randomly until all parts becam

深搜笔记

看搜索已经很久了,对于搜索的思想从原来的死记硬背到现在终于懂了一点其实也蛮不错吧,我自己先总结出来了几条关于在图里面深搜的几条方法,仅供参考: 首先:我们得知道深搜是什么,其次于广搜的区别是什么.然后又哪些模板 举一个深搜例子:red and black:这是初学者最常见到的题.对于这题我们所要考虑的就是一个'.'的个数,这个题先要找到@的位置,这个好办,直接: for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { if(map[i][j]=='@') }

HDU1342 Lotto 【深搜】

应用 渗透问题 游戏中会用到. 动态连接 最近共同祖先 等价有限状态机 物理学Hoshen-Kopelman算法:就是对网格中的像素进行分块 Hinley-Milner多态类型推断 Kruskai最小生成树 Fortran等价语句编译 形态学开闭属性 Matlab中关于图像处理的bwlabel函数 渗透问题 一个N×N的矩阵,判断顶部和底部是否连通就是渗透问题. 下图中左侧的矩阵能渗透,右侧矩阵不能渗透. 渗透问题在电学.流体力学.社会交际中都有应用. 在游戏中可能需要生成一张地图,但是作为地图

HDU5723 Abandoned country 最小生成树+深搜回溯法

Description An abandoned country has n(n≤100000) villages which are numbered from 1 to n. Since abandoned for a long time, the roads need to be re-built. There are m(m≤1000000) roads to be re-built, the length of each road is wi(wi≤1000000). Guarante

CodeM美团点评编程大赛初赛B轮 黑白树【DFS深搜+暴力】

[编程题] 黑白树 时间限制:1秒 空间限制:32768K 一棵n个点的有根树,1号点为根,相邻的两个节点之间的距离为1.树上每个节点i对应一个值k[i].每个点都有一个颜色,初始的时候所有点都是白色的. 你需要通过一系列操作使得最终每个点变成黑色.每次操作需要选择一个节点i,i必须是白色的,然后i到根的链上(包括节点i与根)所有与节点i距离小于k[i]的点都会变黑,已经是黑的点保持为黑.问最少使用几次操作能把整棵树变黑. 输入描述: 第一行一个整数n (1 ≤ n ≤ 10^5) 接下来n-1