免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1233 | 回复: 6
打印 上一主题 下一主题

这题有没有快速的生成方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-06-03 13:58 |只看该作者 |倒序浏览
http://blog.sina.com.tw/archive.php?blog_id=5095&md=entry&id=5875

论坛徽章:
0
2 [报告]
发表于 2005-06-03 14:07 |只看该作者

这题有没有快速的生成方法

好难呀

论坛徽章:
0
3 [报告]
发表于 2005-06-03 15:15 |只看该作者

这题有没有快速的生成方法

我把每个位置所有可能的情况都列出来了
接下来如何进行还没有想到

  1. #!/usr/bin/env python
  2. ALLDATA=range(1,10)
  3. def printall(val):
  4.     for i in val:
  5.         for j in i:
  6.             print j,'\t',
  7.         print ''
  8. def getexist(val):
  9.     zz = []
  10.     for i in val:
  11.         if len(i) == 1:
  12.             zz.append(i[0])
  13.     return zz
  14. def getvnexist(val, n):
  15.     zz = []
  16.     for i in val:
  17.         if len(i[n]) == 1:
  18.             zz.append(i[n][0])
  19.     return zz
  20. def get_union(v1,v2):
  21.     zz=[]
  22.     for i in ALLDATA:
  23.         if i not in v1 and i not in v2:
  24.             zz.append(i)
  25.     return zz
  26. def oplist(val):
  27.     for i in val:
  28.         n = 0
  29.         ln_exist = getexist(i)
  30.         while n < len(i):
  31.             if len(i[n]) != 1:
  32.                 vn_exist = getvnexist(val, n)
  33.                 i[n] = get_union(ln_exist, vn_exist)
  34.             n += 1
  35. def all_ok(val):
  36.     for i in val:
  37.         for j in i:
  38.             if len(j) != 1:
  39.                 return False
  40.     return True
  41. L1=[[],[6],[],[1],[],[4],[],[5],[]]
  42. L2=[[],[],[8],[3],[],[5],[6],[],[]]
  43. L3=[[2],[],[],[],[],[],[],[],[1]]
  44. L4=[[8],[],[],[4],[],[7],[],[],[6]]
  45. L5=[[],[],[6],[],[],[],[3],[],[]]
  46. L6=[[7],[],[],[9],[],[1],[],[],[4]]
  47. L7=[[5],[],[],[],[],[],[],[],[2]]
  48. L8=[[],[],[7],[2],[],[6],[9],[],[]]
  49. L9=[[],[4],[],[5],[],[8],[],[7],[]]
  50. Lall = [L1,L2,L3,L4,L5,L6,L7,L8,L9]

  51. print 'Before game:'
  52. printall(Lall)
  53. print 'Stop here:'
  54. oplist(Lall)
  55. printall(Lall)
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-06-06 11:20 |只看该作者

这题有没有快速的生成方法

昨晚看电视时想到了方法, 于是写了下来, 只是生成那些数字组, 还不能给人玩,却不知空格是怎样决定位置.

论坛徽章:
0
5 [报告]
发表于 2005-06-06 11:26 |只看该作者

这题有没有快速的生成方法

没看太明白
什么意思

论坛徽章:
0
6 [报告]
发表于 2005-06-06 11:40 |只看该作者

这题有没有快速的生成方法

既然写好了
就拿来给同志们分享吧

在牛牛的帮助下我写了一个python的
没仔细测,估计有bug

  1. #!/usr/bin/env python
  2. import copy,sys,pdb
  3. ALLDATA=range(1,10)

  4. def printall(val):
  5.    for i in val:
  6.        for j in i:
  7.            print j,'\t',
  8.        print ''

  9. def getexist(val):
  10.    zz = []
  11.    for i in val:
  12.       if len(i) == 1:
  13.          zz.append(i[0])
  14.    return zz

  15. def getvnexist(val, n):
  16.    zz = []
  17.    for i in val:
  18.        if len(i[n]) == 1:
  19.            zz.append(i[n][0])
  20.    return zz

  21. def get_union(v1,v2):
  22.    zz=[]
  23.    for i in ALLDATA:
  24.        if i not in v1 and i not in v2:
  25.            zz.append(i)
  26.    return zz

  27. def oplist(val):
  28.    for i in val:
  29.        n = 0
  30.        ln_exist = getexist(i)
  31.        while n < len(i):
  32.            if len(i[n]) != 1:
  33.                vn_exist = getvnexist(val, n)
  34.                i[n] = get_union(ln_exist, vn_exist)
  35.            n += 1

  36. def has_repeat(val):
  37.    for i in val:
  38.       if val.count(i) != 1:
  39.          return True
  40.    return False

  41. def is_bad(val):
  42.    if not val:
  43.       return True
  44.    for i in val:
  45.       if has_repeat(getexist(i)):
  46.          return True
  47.       for j in i:
  48.          if len(j) < 1:
  49.             return True
  50.    n = 0
  51.    val_len = len(val[0])
  52.    while n < val_len:
  53.       if has_repeat(getvnexist(val, n)):
  54.          return True
  55.       n += 1
  56.    return False

  57. def all_ok(val):
  58.    if not val:
  59.       return False
  60.    for i in val:
  61.       for j in i:
  62.          if len(j) != 1:
  63.             return False
  64.          if i.count(j) != 1:
  65.             return False
  66.    n = 0
  67.    while n < len(val[0]):
  68.       zz = getvnexist(val, n)
  69.       for i in zz:
  70.          if zz.count(i) != 1:
  71.             return False
  72.       n += 1
  73.    return True

  74. def guess_it(val):
  75.    if not val:
  76.       return []
  77.    elif is_bad(val):
  78.       return []
  79.    elif all_ok(val):
  80.       return val
  81.    for i in val:
  82.       indexi = val.index(i)
  83.       for j in i:
  84.          indexj = i.index(j)
  85.          lenj = len(j)
  86.          if lenj >; 1:
  87.             get_copy = copy.deepcopy(val)
  88.             bakj = copy.copy(j)
  89.             nn = 0
  90.             while nn < lenj:
  91.                get_copy[indexi][indexj] = [bakj[nn]]
  92.                getit = guess_it(get_copy)
  93.                if getit:
  94.                   return getit
  95.                nn += 1
  96.    return []

  97. '''
  98. final resault shuld be this:
  99. L1=[[9],[6],[3],[1],[7],[4],[2],[5],[8]]
  100. L2=[[1],[7],[8],[3],[2],[5],[6],[4],[9]]
  101. L3=[[2],[5],[4],[6],[8],[9],[7],[3],[1]]
  102. L4=[[8],[2],[1],[4],[3],[7],[5],[9],[6]]
  103. L5=[[4],[9],[6],[8],[5],[2],[3],[1],[7]]
  104. L6=[[7],[3],[5],[9],[6],[1],[8],[2],[4]]
  105. L7=[[5],[8],[9],[7],[1],[3],[4],[6],[2]]
  106. L8=[[3],[1],[7],[2],[4],[6],[9],[8],[5]]
  107. L9=[[6],[4],[2],[5],[9],[8],[1],[7],[3]]
  108. '''
  109. L1=[[],[],[3],[1],[7],[4],[2],[5],[]]
  110. L2=[[],[],[],[3],[2],[5],[6],[4],[9]]
  111. L3=[[],[5],[4],[6],[],[],[7],[3],[]]
  112. L4=[[],[2],[],[4],[],[7],[5],[9],[6]]
  113. L5=[[],[9],[6],[8],[5],[],[3],[1],[]]
  114. L6=[[],[3],[],[9],[6],[],[8],[2],[4]]
  115. L7=[[],[8],[9],[7],[1],[],[4],[6],[2]]
  116. L8=[[],[1],[7],[2],[],[],[],[8],[]]
  117. L9=[[],[4],[2],[],[9],[8],[1],[7],[]]

  118. Lall = [L1,L2,L3,L4,L5,L6,L7,L8,L9]

  119. print 'Before game:'
  120. printall(Lall)
  121. oplist(Lall)

  122. print 'guess...'
  123. Lall = guess_it(Lall)
  124. if Lall:
  125.     print 'Success'
  126.     printall(Lall)
  127. else:
  128.     print 'Failure'

复制代码

论坛徽章:
0
7 [报告]
发表于 2005-06-06 12:02 |只看该作者

这题有没有快速的生成方法

// 尚未测试好, 好象有很多组数字.
// Dev-C
#include <iostream>;
using namespace std;

int a[8784][9], b[9][9], c[9][9], cnt;

void run(int m, int l)
{
bool un_equal_flag;
        if (l==9) {
                for (int i=0;i<9;i++) {
                        for (int j=0;j<9;j++) c[(j/3)*3+b[j]/3][(j%3)*3+b[j]%3]=i+1;
                }
                for (int i=0;i<9;i++) {
                        for (int j=0;j<9;j++) cout<<c[j];
                        cout<<endl;
                }
                cout<<endl;
                return;
        }
        for (int i=m;i<cnt-8+l;i++) {
                un_equal_flag=true;
                for (int j=0;j<l && un_equal_flag;j++) {
                        for (int k=0;k<9;k++) {
                                if (a[k]==b[j][k]) {
                                        un_equal_flag=false;
                                        break;               
                                }
                        }                       
                }
                if (un_equal_flag) {
                        copy(a,a+9,b[l]);
                        run(i,l+1);       
                }
        }
}

int main()
{
int d[9];
        for (int i=0;i<9;i++) d=i;
        cnt=0;
        while(next_permutation(d, d+9)) {
                if (d[0]/3==d[1]/3||d[1]/3==d[2]/3||d[2]/3==d[0]/3) continue;
                if (d[3]/3==d[4]/3||d[4]/3==d[5]/3||d[5]/3==d[3]/3) continue;
                if (d[6]/3==d[7]/3||d[7]/3==d[8]/3||d[8]/3==d[6]/3) continue;
                if (d[0]%3==d[3]%3||d[3]%3==d[6]%3||d[6]%3==d[0]%3) continue;
                if (d[1]%3==d[4]%3||d[4]%3==d[7]%3||d[7]%3==d[1]%3) continue;
                if (d[2]%3==d[5]%3||d[5]%3==d[8]%3||d[8]%3==d[2]%3) continue;               
                copy(d,d+9,a[cnt++]);
        }
        run(0,0);
        system("AUSE";
        exit(0);
}

PS: 谁是牛牛?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP