Forgot password?
 Register account
View 1509|Reply 5

[组合] 相继自然数既不同行也不同列

[Copy link]

458

Threads

951

Posts

9832

Credits

Credits
9832

Show all posts

青青子衿 Posted 2019-5-7 12:53 |Read mode
1~9九个数字填入3×3的方格中,要求:
1与2既不同行也不同列且2与3既不同行也不同列且3与4既不同行也不同列且4与5既不同行也不同列
且5与6既不同行也不同列且6与7既不同行也不同列且7与8既不同行也不同列且8与9既不同行也不同列;
问:有多少种摆放方案?
一个例子:
\begin{array}{|r|r|r|r|}   
\hline 2 & 8 & 4\\   
\hline 9 & 3 & 6\\   
\hline 7 & 5 & 1\\
\hline \end{array}

413

Threads

1431

Posts

110K

Credits

Credits
11099

Show all posts

realnumber Posted 2019-5-8 21:58
我猜你不想要编程解决,条件很多
仅仅是“1与2既不同行也不同列且2与3既不同行也不同列且3与4既不同行也不同列”就不容易

46

Threads

323

Posts

2834

Credits

Credits
2834

Show all posts

业余的业余 Posted 2019-5-11 22:12
12072
  1. /*
  2. 相继自然数既不同行也不同列
  3. 1~9九个数字填入3×3的方格中,要求:
  4. 1与2既不同行也不同列且2与3既不同行也不同列且3与4既不同行也不同列且4与5既不同行也不同列
  5. 且5与6既不同行也不同列且6与7既不同行也不同列且7与8既不同行也不同列且8与9既不同行也不同列;
  6. 问:有多少种摆放方案?
  7. */
  8. #include <iostream>
  9. int d[9]={1,2,3,4,5,6,7,8,9};
  10. int cnt;
  11. bool valid(int t)
  12. {
  13.         int r=t/3, c=t%3;
  14.        
  15. //        if(r!=0 && abs(d[t]-d[t-3])==1)
  16. //                return false;
  17. //        if(c!=0 && abs(d[t]-d[t-1])==1)
  18. //                return false;
  19. //        return true;
  20.        
  21. //        return !(r!=0 && abs(d[t]-d[t-3])==1) && !(c!=0 && abs(d[t]-d[t-1])==1);
  22.         return (r==0 || abs(d[t]-d[t-3])!=1) && (c==0 || abs(d[t]-d[t-1])!=1);
  23. }
  24. void backtrack(int t)
  25. {
  26.         if(t==9)
  27.         {
  28.                 ++cnt;
  29.                 return;
  30.         }
  31.         for(int i=t; i<9; ++i)
  32.         {
  33.                 std::swap(d[i],d[t]);
  34.                 if(valid(t))
  35.                         backtrack(t+1);
  36.                 std::swap(d[i],d[t]);
  37.         }
  38. }
  39. int main()
  40. {
  41.         backtrack(0);
  42.         std::cout<<cnt<<std::endl;
  43.         return 0;
  44. }
Copy the Code
可以很容易地修改到 4^2的数字。问题是阶乘复杂度的,再往上可能就比较吃力了。

458

Threads

951

Posts

9832

Credits

Credits
9832

Show all posts

 Author| 青青子衿 Posted 2019-5-11 22:46
回复 3# 业余的业余
12072
可以很容易地修改到 4^2的数字。问题是阶乘复杂度的,再往上可能就比较吃力了。 ...
业余的业余 发表于 2019-5-11 22:12
emmmm,你想回答的是不是这个问题呀?
[组合] 相继自然数不相邻地填入方格
forum.php?mod=viewthread&tid=6080

这个的结果应该有问题吧!“不同行且不同列”比“不相邻”的要求更高,为什么数目还是一样的呢?

46

Threads

323

Posts

2834

Credits

Credits
2834

Show all posts

业余的业余 Posted 2019-5-12 00:36
回复 4# 青青子衿

真的是不相邻做的,我改一下。

46

Threads

323

Posts

2834

Credits

Credits
2834

Show all posts

业余的业余 Posted 2019-5-12 00:41
1512, 如果考虑旋转、镜面对称,是1512/8=189

只需修改上面的 valid 函数到如下版本
  1. bool valid(int t)
  2. {
  3.         int r=t/3, c=t%3;
  4.        
  5.         for(int i=0; i<r; ++i)
  6.                 if(abs(d[t]-d[3*i+c])==1)
  7.                         return false;
  8.        
  9.         for(int i=0; i<c; ++i)
  10.                 if(abs(d[t]-d[3*r+i])==1)
  11.                         return false;
  12.        
  13.         return true;
  14. }
Copy the Code

Mobile version|Discuz Math Forum

2025-5-31 10:52 GMT+8

Powered by Discuz!

× Quick Reply To Top Edit