1. 程式人生 > >南陽理工學院 擅長排列的小明

南陽理工學院 擅長排列的小明

一開始沒想出來,後來發現需要用到stl的一個函式,或者需要使用深度優先搜尋的方法,這兩者都是自己的知識盲點,故首先參考了這篇部落格 http://blog.csdn.net/whjkm/article/details/38498317 以及百度了深度優先搜尋的相關內容,發現dfs的本質實際上是遞迴+回溯。其程式碼的實現思路為:

DFS(頂點v)
{
  標記v為已遍歷;
  for(對於每一個鄰接v切未標記遍歷的店u)
      DFS(u);
}
故需要一個標記陣列,表示每個點是否被訪問過。

附AC程式碼之dfs:

#include<cstdio>
#include<cstring>
int visit[10];
int ans[10];
using namespace std;
void dfs(int pos,int n,int m)
{
	if(pos==m)
	{
		for(int i=0;i<m;i++)
		{
			printf("%d",ans[i]);
		}
		printf("\n");
	}
	else
	{
		for(int i=1;i<=n;i++)
		{
			if(!visit[i])
			{
				visit[i]=1;
				ans[pos]=i;
				dfs(pos+1,n,m);
				visit[i]=0;
			}
		}
	}
	//return ;
}
int main()
{
	int N,n,m;
	scanf("%d",&N);
	while(N--)
	{
		scanf("%d%d",&n,&m);
		memset(visit,0,sizeof(visit));
		dfs(0,n,m);
	}
	return 0;
}


另通過本題的學習,明白了在使用遞迴函式時,當本層執行完畢時,會自動回溯返回上一層,無需新增程式碼中註釋的return。

AC程式碼之STL之next_permutation(a.begin(),a.end())函式:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
	int N;//n,m;
//	string s1,s2;???(1)
	scanf("%d",&N);
	while(N--)
	{
		int n,m;
		string s1,s2;//???(2)
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)
		{
			s1+='0'+i;
		}
		s2=s1.substr(0,m);
		cout<<s2<<endl;
		while(next_permutation(s1.begin(),s1.end()))
		{
			if(s2!=s1.substr(0,m))
			{
				s2=s1.substr(0,m);
				cout<<s2<<endl;
			}
		}
	}
	return 0;
}
next_permutation(a.begin(),a.end())函式:實現字串a按字典序的全排列。

具體原理等可參考部落格:http://www.cnblogs.com/mycapple/archive/2012/08/13/2635853.html

通過本題的學習,發現cin,cout比scanf,printf慢,在越小範圍內定義變數越快。(見???(1)處和???(2)處)

相關推薦

南陽理工學院 擅長排列

一開始沒想出來,後來發現需要用到stl的一個函式,或者需要使用深度優先搜尋的方法,這兩者都是自己的知識盲點,故首先參考了這篇部落格 http://blog.csdn.net/whjkm/article/details/38498317 以及百度了深度優先搜尋的相關內容,發現d

南陽oj 19 擅長排列(dfs)

描述 小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的很擅長。現在需要你寫一個程式來驗證擅長排列的小明到底對不對。 輸入 第一行輸入整數N(1<N<1

擅長排列南陽oj 19)(1)

描述 小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的很擅長。現在需要你寫一個程式來驗證擅長排列的小明到底對不對。 輸入 第一行輸入整數N(1<N<1

nyist oj 19 擅長排列(dfs搜索+STL)

功能 asdf www play algorithm 是否 back using 上傳 擅長排列的小明 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描寫敘述 小明十分聰明。並且十分擅長排列計算。比方給小明一個數字5,他能立馬給出1

nyoj-0469-擅長排列 II(找規律)

for 題意 序列 簡便 DC span names n-1 href nyoj-0469-擅長排列的小明 II 思路:遞推分析:為了簡便起見,我們用Ai代表第i個數字 , 由於A1一直是1,所以A2只能是2或3。假設dp[n]表示1->n這個序列的方案數

K - 擅長排列

#include<stdio.h> #include<string.h> int m,t,a[1000],b[1000]; void dfs(int f) { if(f==m+1) { for(int i=1;i<=m;i++) { printf("%

NYOJ 19 擅長排列 (STL之next_permutation()的使用)

擅長排列的小明 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的

nyoj 19 擅長排列 【全排列(n中抽取m個數)】

擅長排列的小明 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,如果你想為難他,在這5個數字中選出幾個數字讓他繼續全排列,那麼你就錯了,他同樣的

nyist oj 19 擅長排列(dfs搜尋+STL)

擅長排列的小明 時間限制:1000 ms  |  記憶體限制:65535 KB 難度:4 描述 小明十分聰明,而且十分擅長排列計算。比如給小明一個數字5,他能立刻給出1-5按字典序的全排列,

開心的南陽oj49)(01背包)

put adding track ng- family text 設計 art can 開心的小明 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描寫敘述小明今天非常開心。家裏購置的新房就要領鑰匙了,新房裏有一間他自己專用的非常寬

的存錢計劃 南陽acm54

light == 發現 可能 過程 內存 來源 AR display 小明的存錢計劃 時間限制:3000 ms | 內存限制:65535 KB 難度:2 描述 小明的零花錢一直都是自己管理。每個月的月初媽媽給小明300元錢,小明會預算這個月的花銷,並且總能做到實際花銷和

COGS 2687 討厭整除的

void lan problem pid http cst 聯通 oid pri 二次聯通門 : COGS 2687 討厭整除的小明 /* cogs 2687 討厭整除的小明 打表出奇跡..   考場時看了一下樣例就感覺有非常鬼畜的做法。。  

NYOJ 55 懶省事的(哈弗曼樹)

pad sans div sam time span border dsm 方案 懶省事的小明 時間限制:3000 ms | 內存限制:65535 KB 難度:3 描寫敘述 小明非常想吃果子,正好果園果子熟了。在果園裏,小明已經將全部的果子

SDUT 2766-傳奇2(母函數)

weight 方法 vector 不但 lua emc ask ++ file 小明傳奇2 nid=24#time" title="C、C++、go、haskell、lua、pascal Time Limit1000ms M

杭電 2096 A+B

miss script ava spa ace 個數 例如 mem ani 小明A+B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm

hunnu11544:的煩惱——找字符串

字典 out 過程 自己 input body cto main ffffff Problem description 小明是個非常優秀的同學。他除了特別公正外,他也非常細心,當然老師肯定也知道,這不,老師又有事情找他幫忙了。老師每周都會給

hdu 4521 系列問題——序列(線段樹+DP或擴展成經典的LIS)

upd 輸入數據 accep 單位 行為 至少 tracking math 並且 小明系列問題——小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Ot

hunnu 11545的煩惱——找路徑 (最大流)

tro stdio.h class 屬於 max pre 如果 scrip 什麽 小明的煩惱——找路徑 Time Limit: 2000ms, Special Time Limit:5000ms, Memory Limit:32768KB

搬家_NOI導刊2010提高(05)

span long i++ 高效 效率 algorithm using 分鐘 %d 題目描述 小明要搬家了,大家都來幫忙。 小明現在住在第N樓,總共K個人要把X個大箱子搬上N樓。 最開始X個箱子都在1樓,但是經過一段混亂的搬運已經亂掉了。最後大家發現這樣混亂地搬運過程效率

hdu 4511 系列故事——女友的考驗(AC自動機+dp)

isp lan space alt return fin clas sqrt lose 題目鏈接:hdu 4511 小明系列故事——女友的考驗 題意: 中文不解釋。 題解: 考慮將那些限制的條件插進AC自動機裏面,然後在AC自動機上dp一下最短路就行了。 考慮dp[i][j