找回密码
 欢迎注册
楼主: wayne

[提问] 关于android手机图案锁屏的计数

[复制链接]
发表于 2013-6-17 22:13:53 | 显示全部楼层
2=>1,3,4,5,6,7,9
3=>2,4,5,6,8
4=>1,2,3,5,7,8,9
5=>1,2,3,4,6,7,8,9
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-17 22:15:29 | 显示全部楼层
6=>1,2,3,5,7,8,9
7=>2,4,5,6,8
8=>1,3,4,5,6,7,9
9=>2,4,5,6,8
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-18 15:07:10 | 显示全部楼层
不错,这种方法好是好,只是有一种情况没考虑吧。
比如,前面如果已经经过5的话,后面4可以直接跳到6的

参考6#可行方案的2516图
路径{8,5,7,4,6}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-18 15:30:48 | 显示全部楼层
待我写个程序来
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-18 16:37:48 | 显示全部楼层

  1. #include <stdio.h>

  2. int mask[10] = {1,0,0,0,0,0,0,0,0,0};
  3. int next[10][10] =
  4. {0,0,0,0,0,0,0,0,0,0,
  5. 5,2,4,5,6,8,0,0,0,0,
  6. 7,1,3,4,5,6,7,9,0,0,
  7. 5,2,4,5,6,8,0,0,0,0,
  8. 7,1,2,3,5,7,8,9,0,0,
  9. 8,1,2,3,4,6,7,8,9,0,
  10. 7,1,2,3,5,7,8,9,0,0,
  11. 5,2,4,5,6,8,0,0,0,0,
  12. 7,1,3,4,5,6,7,9,0,0,
  13. 5,2,4,5,6,8,0,0,0,0,
  14. };
  15. int counter[10] = {0,0,0,0,0,0,0,0,0,0};
  16. int graph[10] = {0,0,0,0,0,0,0,0,0,0};
  17. int nextNumber = 0;
  18. int graphPostion = 0;

  19. void first( void )
  20. {
  21.   int i;
  22.   for (i = 1; i <= 9 ; i ++)
  23.   {
  24.     mask[i] = 1;
  25.         graph[graphPostion] = i;
  26.         circle( graphPostion + 1 );
  27.     mask[i] = 0;
  28.   }
  29. }

  30. void circle( int graphPostion )
  31. {
  32.   int i;
  33.   int noPostion = 1;
  34.   int n = graph[graphPostion - 1];
  35.   for (i = 1; i <= next[n][0]; i ++)
  36.   {
  37.     if (mask[next[n][i]] == 0)
  38.         {
  39.           noPostion = 0;
  40.           mask[next[n][i]] = 1;
  41.             graph[graphPostion] = next[n][i];
  42.           counter[graphPostion + 1] ++;
  43.           circle( graphPostion + 1 );
  44.           mask[next[n][i]] = 0;          
  45.         }
  46.   }   
  47.   
  48.   if (noPostion)
  49.   {
  50.     printf("find: ");
  51.     for (i = 0; i < graphPostion; i ++)
  52.     {
  53.           printf("%1d  ", graph[i]);
  54.     }
  55.         printf("\n");
  56.   }       
  57. }

  58. int main ( void )
  59. {
  60.   int i;
  61.   first( );
  62.   for (i = 4; i <= 9; i ++)
  63.     printf("%d: %d\n", i, counter[i]);
  64.   return 0;
  65. }
复制代码
4: 1400
5: 5328
6: 16032
7: 35328
8: 49536
9: 32256
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-18 17:46:22 | 显示全部楼层
  1. PointsToBeChecked[{{a_,b_},{c_,d_}}]:=Module[{g=GCD[c-a,d-b]},If[g>1,{a+# (c-a)/g,b+# (d-b)/g}&/@Range[g-1],{}]];
  2. n=3;ddd=Flatten[Table[{{i,j}},{i,0,n-1},{j,0,n-1}],1];
  3. Table[{ii,Product[n^2-k,{k,0,ii-1}],ddd=Select[Flatten[Table[Join[ii,List@#]&/@Complement[Flatten[Array[List,{n,n}]-1,1],ii],{ii,ddd}],1],Length[PointsToBeChecked[#[[-2;;-1]]]]==0&];Length[ddd]},{ii,2,n^2}]
复制代码
对算法做了改进,反而跟无心人的答案对上了。
{2, 72, 56},
{3, 504, 304},
{4, 3024, 1400},
{5, 15120, 5328},
{6, 60480, 16032},
{7, 181440, 35328},
{8, 362880, 49536},
{9, 362880, 32256}}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-6-18 21:41:54 | 显示全部楼层
算得4*4的情况:
2,240,172
3,3360,1696
4,43680,15580
5,524160,132264
6,5765760,1029232
7,57657600,7286016
后面就算不动了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-19 14:37:53 | 显示全部楼层


证明俺算法没错了哦
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-20 13:29:19 | 显示全部楼层
取出所有的排列,然后一个一个地判定!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-6-24 11:29:36 | 显示全部楼层
看了下无心人的程序,能计算#6给出的合法情况吗?
5->2->7->3->4

因为5是已经标记过的,所以可以从7直接到3了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-5 10:38 , Processed in 0.044983 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表