手機九宮格加密種數

加密規則無外乎下面2種
1、任何兩個點都可以直接相連。
這個很簡單,1到9的基數爲9排列相加

#include<stdio.h>

char SUDOHU[] = "abcdefghi";
int queue[9] = {0};
int flag[9] = {0};
unsigned int count = 0;
void perm(int s, int n)
{
    int i;
    if(s > n)
    {
        return;
    }

     if (s == n)
     {
         count++;
         return ;
     }

     for (i = 0; i < n; i++)
     {
         if (flag[i] == 0)
         {
             flag[i] = 1;
             queue[s] = SUDOHU[i];
             perm(s+1, n);
             flag[i] = 0;
         }
     }
 }

 int main()
 {
    int i;
    for(i = 1; i <= 9; i++)
        perm(9 - i, 9);
    printf("%d\n", count);
 }


運行結果

這種加密方式共有986409種
2、不能隔點相連,這種方式略麻煩
#include<stdio.h>
#include<string.h>
char SUDOKU[] = "abcdefghi";
char AC_MATCH[] = "bdef";
char B_MATCH[] = "acdef";
char DF_MATCH[] = "eabcghi";
char E_MATCH[] = "abcdfghi";
char GI_MATCH[] = "hdef";
char H_MATCH[] = "gidef";
int queue[9] = {0};
int top = 0;
int count = 1;
int flag[9] = {0};
char get_new[] = {0};
int byte_match(char pro_byte, char next_byte)
{
	int i, flag = 0;
	switch(pro_byte)
	{
	case 'a':
		for(i = 0; i < strlen(AC_MATCH); i++)
		{
			if(next_byte == AC_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'b':
		for(i = 0; i < strlen(B_MATCH); i++)
		{
			if(next_byte == B_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'c':
		for(i = 0; i < strlen(AC_MATCH); i++)
		{
			if(next_byte == AC_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'd':
		for(i = 0; i < strlen(DF_MATCH); i++)
		{
			if(next_byte == DF_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'e':
		for(i = 0; i < strlen(E_MATCH); i++)
		{
			if(next_byte == E_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'f':
		for(i = 0; i < strlen(DF_MATCH); i++)
		{
			if(next_byte == DF_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'g':
		for(i = 0; i < strlen(GI_MATCH); i++)
		{
			if(next_byte == GI_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'h':
		for(i = 0; i < strlen(H_MATCH); i++)
		{
			if(next_byte == H_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	case 'i':
		for(i = 0; i < strlen(GI_MATCH); i++)
		{
			if(next_byte == GI_MATCH[i])
			{
				flag = 1;
				break;
			}
		}break;
	}
	return flag;
}
void perm(int s, int n)
{
	int i, match_flag = 1, new_count = 0;
	if(s > n)
	{
		return;
	}
	if (s == n)
	{
		for (i = 0; i < n; i++)
		{
			if(queue[i] != '\0')
			{
				get_new[new_count++] = queue[i];
			}
		}
		for (i = 0; i < strlen(get_new) - 1; i++)
		{
			if(byte_match(get_new[i], get_new[i + 1]) == 0)
			{
				match_flag = 0;
				break;
			}
		}
		if(match_flag)
		{
			for (i = 0; i < strlen(get_new); i++)
			printf("%c", get_new[i]);
			printf(" %d", count++);
		}
		printf("\t");
		return ;
	}
	
	for (i = 0; i < n; i++)
	{
		if (flag[i] == 0)
		{
			flag[i] = 1;
			queue[s] = SUDOKU[i];
			perm(s+1, n);
			flag[i] = 0;
		}
	}
}

int main()
{
	int i;
	for(i = 1; i <= 9; i++)
	perm(9 - i, 9);
}
運行結果如下

這種加密方式共有38389種
發佈了16 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章