搜索
查看: 2291|回复: 10
打印 上一主题 下一主题

【第五章第8节】动手试一试 题解

[复制链接]
跳转到指定楼层
楼主
发表于 2013-11-4 01:12:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
解题思路是把三角形摊平,设节点上的数字分别为x, y, m, n, p, q
然后(平庸的解法)像书上一样穷举出所有可能性,除掉数字重复的情况,最后判断是否满足x+y+m = m+n+p = p+q+x
如果满足则输出
其实只不过比书上多了一个数字
  1. #include <stdio.h>

  2. int main()
  3. {
  4.   int x, y, m, n, p, q;
  5.   for(x=1; x!=7; ++x)
  6.     for(y=1; y!=7; ++y)
  7.       for(m=1; m!=7; ++m)
  8.         for(n=1; n!=7; ++n)
  9.           for(p=1; p!=7; ++p)
  10.             for(q=1; q!=7; ++q)
  11.               if(x != y && x != m && x != n && x != p && x != q &&
  12.                  y != m && y != n && y != p && y != q &&
  13.                  m != n && m != p && m != q &&
  14.                  n != p && n != q &&
  15.                  p != q)
  16.                 if(x+y+m == m+n+p && m+n+p == p+q+x)
  17.                   printf("%d %d %d %d %d %d\n", x, y, m, n, p, q);
  18.   return 0;
  19. }
复制代码
沙发
 楼主| 发表于 2013-11-4 02:32:16 | 只看该作者
这个问题的实质是生成1-6的所有排列(还可能有些更聪明的解法,但是对于这么小的数字没有必要去考虑)
上面用的方法的计算量大约是 6^6 = 46656
而6 != 720,大了两个数量级

生成排列的算法有很多,但是对于这么简单的问题确实没必要用,而且自己手动实现还要去debug
如果实在不愿意敲那么多重复性的代码,可能就需要借助点其他语言或者工具软件了
最为简洁的的方法或许是用C++的next_permutation
代码如下
  1. #include <iostream>
  2. #include <algorithm>

  3. int main()
  4. {
  5.   int a[] = {1, 2, 3, 4, 5, 6};
  6.   do{
  7.     if(a[0] + a[1] == a[3] + a[4] &&
  8.        a[3] + a[2] == a[5] + a[0]){
  9.       for(int i=0; i!=6; ++i)
  10.         std::cout << a[i] << " ";
  11.       std::cout << "\n";
  12.     }
  13.   }while(std::next_permutation(a, a+6));
  14.   return 0;
  15. }
复制代码
板凳
发表于 2013-11-28 12:44:02 | 只看该作者
辛苦!辛苦!!!
地板
发表于 2013-12-6 03:23:56 | 只看该作者
如果把 if(x+y+m == m+n+p && m+n+p == p+q+x)改为 if(x+y+m == m+n+p == p+q+x),为什么什么都不显示?
5#
发表于 2014-1-20 16:47:50 | 只看该作者
这样写就可以了的吗?不用考虑x+y+n==n+q+p&&n+q+p==p+m+x 等等的这些情况了吗?还是搞不太清楚
6#
 楼主| 发表于 2014-1-20 19:54:02 | 只看该作者
red23 发表于 2014-1-20 16:47
这样写就可以了的吗?不用考虑x+y+n==n+q+p&&n+q+p==p+m+x 等等的这些情况了吗?还是搞不太清楚

x,y这些变量都是表示固定的一个点位
和x,y共线的只能有一个点,我上面假设的是m,那么就不可能是n
书不在我手边,不知道您是出于何种考虑,认为要计算x,y,n共线的可能性?
7#
发表于 2014-1-20 20:45:09 | 只看该作者
rosynirvana 发表于 2014-1-20 19:54
x,y这些变量都是表示固定的一个点位
和x,y共线的只能有一个点,我上面假设的是m,那么就不可能是n
书不 ...

我是初学者啦,想着想着就忘了当各整型变量为某一特定值并且在符合二个if条件语句的时候只会出现在一个特定位置上的。哈哈,犯了一个低级的错误。见谅哈!!!
8#
发表于 2014-1-20 21:00:23 | 只看该作者
其实这个问题我想了一天啦,好不容易才自己拗过来的,当一个变量在一特定范围内能循环取到所需要的所有数值时是不用再去考虑他的排列位置问题的。因为相对于他,当他符合所有条件时只会有一种排列。囧!!!
9#
发表于 2015-4-29 20:25:39 | 只看该作者
根据理解,我的解法如下,但是我觉得还是有些问题,出现多个重复解,但是又不知道如何消除重复解。另一楼的解法也出现重复解。
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b,c,d,e,f,x,y;
    for(a=1;a<=6;a++)
    {
            for(b=1;b<=6;b++)
            {
                    for(c=1;c<=6;c++)
                    {
                            for(d=1;d<=6;d++)
                            {
                                    for(e=1;e<=6;e++)
                                    {
                                            for(f=1;f<=6;f++)
                                            {
                                                    if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f
                                                               &&b!=c&&b!=d&&b!=e&&b!=f
                                                                     &&c!=d&&c!=e&&c!=f
                                                                           &&d!=e&&d!=f
                                                                                 &&e!=f)
                                                    {
                                                   
                                                            if(a+b+c==c+d+e&&c+d+e==e+f+a)
                                                            {
                                                                    x=a+b+c;
                                                                    printf("%d+%d+%d=%d+%d+%d=%d+%d+%d=%d\n",a,b,c,c,d,e,e,f,a,x);
                                                           
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }       
    system("pause");
    return 0;
}[/mw_shl_code]
10#
发表于 2015-6-14 16:12:49 | 只看该作者
#include <stdio.h>
#include <stdlib.h>
int main()
{
        int        a,b,c,d,e,f,sum;
    sum=12;
    for(a=1;a<=6;a++)
         for(b=1;b<=6;b++)
      for(c=1;c<=6;c++)
       for(d=1;d<=6;d++)
        for(e=1;e<=6;e++)
         for(f=1;f<=6;f++)
                        if(a!=b && a!=c && a!=d && a!=e && a!=f
                                        && b!=c && b!=d && b!=e && b!=f
                                                        && c!=d && c!=e && c!=f
                                                                        && d!=e && d!=f
                                                                                        && e!=f )
              if(sum==a+b+c && sum==c+d+e && sum==e+f+a)
    printf("%d+%d+%d=%d+%d+%d=%d+%d+%d=%d\n",a,b,c,c,d,e,e,f,a,sum);
        system("pause");
        return 0;
}
11#
发表于 2016-1-4 12:42:11 | 只看该作者
输出三角形^-^
[mw_shl_code=c,true]printf("        %d\n",c);
                                                                        printf("      /   \\  \n");
                                                                        printf("    %d       %d\n",b,d);
                                                                        printf("  /           \\ \n");
                                                                        printf("%d ——  %d  —— %d\n\n",a,f,e);[/mw_shl_code]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表