poj 1256(Anagram+シークレット配列アルゴリズム)

1526 ワード

テーマリンク:http://poj.org/problem?id=1256
      タイトルの意味:文字列a[15]は、これらの文字が構成されているすべての重複しない文字列を求める必要があります.
      コードは大牛のところから借りています.
コード:
#include
#include

int n,len;
int hash[15]={0};
char a[54];
char ans[15];

int dfs(int k)
{
	int i,j;
	for(i=1;i<=52;i++)
		if(hash[i]>0)
		{
			hash[i]--;
			if(i % 2 == 0)
				ans[k]=i/2+96;
			else 
				ans[k]=(i+1)/2+64;
			if(k == len-1)
			{
                  for(j=0;j= 'A' && a[i] <= 'Z')
				hash[(a[i]-64)*2-1]++;
			else
				hash[(a[i]-96)*2]++;
		}
      dfs(0);
	}
	return 0;
}
 
以下はこの問題を解く過程で探した「再帰的に完全な並べ替えアルゴリズムを求める」です.
再帰的に完全な配列を求めるアルゴリズムコード:
#include  
inline void Swap(char& a, char& b) 
{//   a b 
    char temp = a; 
    a = b; 
    b = temp; 
} 

void Perm(char list[], int k, int m) 
{ //  list [k:m ]        
    int i; 
    if (k == m) {//         
        for (i = 0; i <= m; i++) 
            putchar(list[i]); 
        putchar('
'); } else // list[k:m ] // for (i=k; i <= m; i++) { Swap (list[k], list[i]); Perm (list, k+1, m); Swap (list [k], list [i]); } } int main() { char s[]="123"; Perm(s, 0, 2); return 0; }