程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 排列搜索-龐果網(C語言版,雖實現了,但未通過測試,時間超過3s,使用的是全排序方法,願大神指導)

排列搜索-龐果網(C語言版,雖實現了,但未通過測試,時間超過3s,使用的是全排序方法,願大神指導)

編輯:關於C語言

注:雖然沒有通過測試,但學會了用遞歸實現全排序的方法(話說此題的通過率真低呀,哪位高手知道正確答案呢?) 但剛才用gcc測了下,當N=11時,運行時間為2.3s(我的機子是linux mint 16 64bit, 酷睿雙核),之前在windows上跑要7、8s呢
題目詳情:

設數組a包含n個元素恰好是0..n - 1的一個排列,給定b[0],b[1],b[2],b[3],

問:有多少個0..n-1的排列a,滿足(a[a[b[0]]]*b[0]+a[a[b[1]]]*b[1]+a[a[b[2]]]*b[2]+a[a[b[3]]]*b[3])%n==k ?

輸入包含5個參數:N,K,B0,B1,B2,B3,其中 4<= N<12, 0 <= K,B0,B1,B2,B3 < N。


解題代碼:

#include 

#define MAX_N 11
int a[MAX_N] = {0};
int g_count = 0;
int g_N;
int g_K;
int g_B0;
int g_B1;
int g_B2;
int g_B3;

// swap a[i] and a[offset]
void swap(int i, int offset)
{
	int temp = a[i];
	a[i] = a[offset];
	a[offset] = temp;
}

// find permutation (全排列)
void perm(int offset)
{
	if (g_N-1 == offset)
	{
		g_count += (a[a[g_B0]]*g_B0 + a[a[g_B1]]*g_B1 + a[a[g_B2]]*g_B2 + a[a[g_B3]]*g_B3)%g_N==g_K;
		return;
	}
	else
	{	
		int i;
		for (i = offset; i < g_N; ++i)
		{
			swap(i, offset);
			perm(offset + 1);
			swap(i, offset);
		}
	}
}

int howmany (int N,int K,int B0,int B1,int B2,int B3)
{
	g_N = N;
	g_K = K;
	g_B0 = B0;
	g_B1 = B1;
	g_B2 = B2;
	g_B3 = B3;

	// init array a
	int i;
	for (i = 0; i < N; ++i)
	{
		a[i] = i;
	}

 	perm(0);

	return g_count;
}

// 該段代碼可能在龐果上編譯不過(龐果你又調皮了),把報錯的那個局部變量改為全局變量即可。

原題地址:http://hero.pongo.cn/Question/Details?ID=292&ExamID=287

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved