• CODE[VS] 1294 全排列


    题目描述 Description

    给出一个n, 请输出n的所有全排列

    输入描述 Input Description

    读入仅一个整数n   (1<=n<=10)

    输出描述 Output Description

    一共n!行,每行n个用空格隔开的数,表示n的一个全排列。并且按全排列的字典序输出。

    样例输入 Sample Input

    3

    样例输出 Sample Output

    1 2 3

    1 3 2

    2 1 3

    2 3 1

    3 1 2

    3 2 1

    数据范围及提示 Data Size & Hint


    这个题只是一个简单的DFS的算法,但是在做到的时候遇到了两个问题,第一CODE[VS]的编译器对定义的全局变量数组是不初始化为0的,这导致RE了好久。第二,关于cout和cin与printf和scanf之间的速度差异问题,一开始使用的代码是这样的:
    /*************************************************************************
        > File Name: 全排列.cpp
        > Author: zhanghaoran
        > Mail: chilumanxi@gmail.com 
        > Created Time: 2015年07月17日 星期五 11时41分21秒
     ************************************************************************/
    
    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int n;
    int flag[11];
    int parr[11];
    
    void dfs(int num){
    	if(num == n + 1){
    	 	for(int i = 1; i <= n; i ++){
    			cout << parr[i] << " ";
    		}
    		cout << endl;
    		return ;
    	}
    	for(int i = 1; i <= n; i ++){
    		if(flag[i])
    			continue;
    		parr[num] = i;
    		flag[i] = 1;
    		dfs(num + 1);
    		flag[i] = 0;
    	}
    	return ;
    }
    
    int main(void){
    	memset(flag,0,sizeof(flag));
            memset(parr,0,sizeof(parr));
    	cin >> n;
    	dfs(1);
    	return 0;
    }

    时对于9以上的数据就超时了,弄得我很郁闷。一开始想的该不会是输出效率问题吧,但是实际上确实如此,更换以后就AC了这道题目,cin和cout为什么这么慢(据说要比scanf和printf慢一倍多)。网上说:
    默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销
    那么我们以后就尽量不用cin和cout作为输入输出吧。。
  • 相关阅读:
    NTFS文件系统的主要优点体现在以下三个方面
    子网划分,主机号,网络号计算
    hdu1008
    hdu1006
    hdu1004
    Git 版本回退
    Git 提交修改内容和查看被修改的内容
    Git 怎么创建本地库,向本地库提交文件
    mybatis中#{}和${}的区别
    请求头和响应头
  • 原文地址:https://www.cnblogs.com/chilumanxi/p/5136114.html
Copyright © 2020-2023  润新知