加密规则无外乎下面2种
1、任何两个点都可以直接相连。
这个很简单,1到9的基数为9排列相加
运行结果
这种加密方式共有986409种
2、不能隔点相连,这种方式略麻烦
这种加密方式共有38389种
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种