哈夫曼树
结点结构
typedef struct {
int weight;
int parent, left, right;
} HTNode, * HuffmanTree;
动态二维数组
typedef char * * HuffmanCode;
选择最小min
void Select ( HuffmanTree HT, int end, int * s1, int * s2)
{
int min1, min2;
int i = 1 ;
while ( HT[ i] . parent != 0 && i <= end) {
i++ ;
}
min1 = HT[ i] . weight;
* s1 = i;
i++ ;
while ( HT[ i] . parent != 0 && i <= end) {
i++ ;
}
if ( HT[ i] . weight < min1) {
min2 = min1;
* s2 = * s1;
min1 = HT[ i] . weight;
* s1 = i;
}
else {
min2 = HT[ i] . weight;
* s2 = i;
}
for ( int j = i + 1 ; j <= end; j++ )
{
if ( HT[ j] . parent != 0 ) {
continue ;
}
if ( HT[ j] . weight < min1) {
min2 = min1;
min1 = HT[ j] . weight;
* s2 = * s1;
* s1 = j;
}
else if ( HT[ j] . weight >= min1 && HT[ j] . weight < min2) {
min2 = HT[ j] . weight;
* s2 = j;
}
}
}
创建树
void CreateHuffmanTree ( HuffmanTree * HT, int * s, int n)
{
if ( n <= 1 ) return ;
int m = 2 * n - 1 ;
* HT = ( HuffmanTree) malloc ( ( m + 1 ) * sizeof ( HTNode) ) ;
HuffmanTree p = * HT;
for ( int i = 1 ; i <= n; i++ )
{
( p + i) -> weight = * ( w + i - 1 ) ;
( p + i) -> parent = 0 ;
( p + i) -> left = 0 ;
( p + i) -> right = 0 ;
}
for ( int i = n + 1 ; i <= m; i++ )
{
( p + i) -> weight = 0 ;
( p + i) -> parent = 0 ;
( p + i) -> left = 0 ;
( p + i) -> right = 0 ;
}
for ( int i = n + 1 ; i <= m; i++ )
{
int s1, s2;
Select ( * HT, i - 1 , & s1, & s2) ;
( * HT) [ s1] . parent = ( * HT) [ s2] . parent = i;
( * HT) [ i] . left = s1;
( * HT) [ i] . right = s2;
( * HT) [ i] . weight = ( * HT) [ s1] . weight + ( * HT) [ s2] . weight;
}
}
编码
void HuffmanCoding ( HuffmanTree HT, HuffmanCode * HC, int n) {
* HC = ( HuffmanCode) malloc ( ( n + 1 ) * sizeof ( char * ) ) ;
char * cd = ( char * ) malloc ( n * sizeof ( char ) ) ;
cd[ n - 1 ] = '\0' ;
for ( int i = 1 ; i <= n; i++ ) {
int start = n - 1 ;
int c = i;
int j = HT[ i] . parent;
while ( j != 0 ) {
if ( HT[ j] . left == c)
cd[ -- start] = '0' ;
else
cd[ -- start] = '1' ;
c = j;
j = HT[ j] . parent;
}
( * HC) [ i] = ( char * ) malloc ( ( n - start) * sizeof ( char ) ) ;
strcpy_s ( ( * HC) [ i] , 4 , & cd[ start] ) ;
}
free ( cd) ;
}
//打印函数
void PrintHuffmanCode ( HuffmanCode htable, int * s, int n)
{
printf ( "Huffman code : \n" ) ;
for ( int i = 1 ; i <= n; i++ )
printf ( "%d code = %s\n" , w[ i - 1 ] , htable[ i] ) ;
}
int main ( )
{
int s[ 4 ] = { 7 , 4 , 1 , 6 } ;
int n = 4 ;
HuffmanTree htree;
HuffmanCode htable;
CreateHuffmanTree ( & htree, w, n) ;
HuffmanCoding ( htree, & htable, n) ;
PrintHuffmanCode ( htable, w, n) ;
return 0 ;
}
N – QUeen – DFS
定义结构
int n;
int cnt = 0 ;
int a[ 20 ] ;
检查函数
int check ( int x, int y) {
int i;
for ( i = 1 ; i <= x; i++ ) {
if ( a[ i] == y) {
return 0 ;
}
if ( i + a[ i] == x + y) {
return 0 ;
}
if ( a[ i] - i == y - x) {
return 0 ;
}
}
return 1 ;
}
dfs
void dfs ( int cur) {
if ( cur == n + 1 ) {
cnt++ ;
return ;
}
int i;
for ( i = 1 ; i <= n; i++ ) {
if ( check ( cur, i) ) {
a[ cur] = i;
dfs ( cur + 1 ) ;
a[ cur] = 0 ;
}
}
return ;
}
main
int main ( ) {
scanf ( "%d" , & n) ;
int i;
for ( i = 0 ; i < 20 ; i++ ) {
a[ i] = 0 ;
}
dfs ( 1 ) ;
printf ( "%d" , cnt) ;
return 0 ;
}