免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: yy_galois
打印 上一主题 下一主题

[C] 学习编程的几点看法 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2008-06-25 15:44 |只看该作者
原帖由 yy_galois 于 2008-6-24 21:56 发表
我靠,刚才我编了两个小时。。


其实问题没那么复杂, 只要将逻辑概念用数学公式描述就可以很快解出.
我的抽象方式是这样的:
有四个自变量, X1, X2, X3,X4, 分别表示甲,乙,丙,丁是否强盗. 取值范围只有两个值, 0表示不是, 1表示是.因此原题可以抽象为以下公式:
(x1==0)+(X4==1)+(X2==1)+(X4==0) == 1;  //等式1
X1+X2+X3+X4 == 1;  //等式2
根据等式2, 可知只能有一个变量值为1, 其它必为0. 分别将x1=1, x2=1, x3=1, x4=1代入 等式1, 只有x=1的情况下, 等式1成立. 因此答案是甲.

如果以C语言实现, 一个循环即可实现:

int main()
{
int x[4];
int i;

for (i=0; i<4; i++)
{
    memset( (char*)x, 0, sizeof(int)*4);
    x=1;
    if (  (!x[0]+x[3]+x[1]+!x[3]) == 1)
        printf(" No. %d is Robber!\n", i);
}

}

论坛徽章:
0
22 [报告]
发表于 2008-06-25 16:34 |只看该作者
楼上强人
虽然我和你的思路以及判断方法一样,但是你把这种算法抽象成数学表达式,很是佩服!

论坛徽章:
0
23 [报告]
发表于 2008-06-25 16:39 |只看该作者
多说无益,看书实践乃正道

论坛徽章:
0
24 [报告]
发表于 2008-06-25 17:08 |只看该作者

如下:


  1.       1 int main(void)
  2.       2 {
  3.       3     int x = 0;
  4.       4
  5.       5     for (x = 0; x < 4; x++)
  6.       6     {
  7.       7         int a[4] = {0};
  8.       8         a[x] = 1;
  9.       9
  10.      10         int i = 0;
  11.      11         printf("--%d--\n", x);
  12.      12         for (i = 0; i < 4; i++)
  13.      13         {
  14.      14             int boolean[4] = {0};
  15.      15             boolean[i] = 1;
  16.      16
  17.      17             if ((boolean[0] == !a[0])
  18.      18                     && (boolean[1] == a[3])
  19.      19                     && (boolean[2] == a[1])
  20.      20                     && (boolean[3] == !a[3]))
  21.      21             {
  22.      22                 printf("[%d]\n", i);
  23.      23             }
  24.      24         }
  25.      25     }
  26.      26 }
复制代码

[ 本帖最后由 77h2_eleven 于 2008-6-25 17:46 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2008-06-25 17:12 |只看该作者
建议大家做做 7女生问题。

论坛徽章:
0
26 [报告]
发表于 2008-06-25 17:19 |只看该作者
原帖由 zszyj 于 2008-6-25 15:44 发表
if (  (!x[0]+x[3]+x[1]+!x[3]) == 1)

这个判断条件肯定是不对的。

论坛徽章:
0
27 [报告]
发表于 2008-06-25 17:32 |只看该作者
哈哈,大家这么高兴。我也来个C++/STL版

  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;

  5. int main() {
  6.         string m = "OOOX";
  7.         do {
  8.                 if ((m[0] != 'X') +(m[3] == 'X') + (m[1] == 'X') + (m[3] != 'X') == 1)
  9.                         cout<<m<<endl;
  10.         } while (next_permutation(m.begin(), m.end()));

  11.         return 0;
  12. }
复制代码


形象吧。嗯嗯。

[ 本帖最后由 jigloo 于 2008-6-25 17:51 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2008-06-25 17:47 |只看该作者
原帖由 77h2_eleven 于 2008-6-25 17:19 发表

这个判断条件肯定是不对的。

肯定是对的, 而且也测试过, 证实结果是正确的, 答案就是甲.
这个条件的原理就是, 四个判断只有一个正确. 自已好好体会一下吧.
另外, 不知何故, 我贴出来的代码, 明明是 x [ i ] =1;
可是显示出来却变成了 斜体的 x=1, 这可不是我的错, 应该是HTML显示的问题吧.

[ 本帖最后由 zszyj 于 2008-6-25 17:51 编辑 ]

论坛徽章:
0
29 [报告]
发表于 2008-06-25 19:37 |只看该作者
我也来试试 :)
我的办法比较笨 :(


  1. int main(void)
  2. {
  3.         int i, j, k;
  4.         int yes = 0;  //有yes个人说对了

  5.         char a[4][4] =
  6.            {
  7.                 'n','a','a','a',
  8.                 'a','a','a','y',
  9.                 'a','y','a','a',
  10.                 'a','a','a','n'
  11.         };   //a[i][j] == y 表示i说j偷的   a[i][j] == n 表示i说j没偷  a[i][j] == a 表示i对j没表态
  12.        
  13.         char b[4];  //在假设东西是某个人偷的情况下, b[i] == y 表示是i偷的, b[i] == n  表示不是i偷的
  14.         char c[4];  //c[i] == y 表示i说话正确,c[i] == n 表示i撒谎了

  15.         //如果i说是某个人偷的,表示i承认其余的人没有偷,所以对a[4][4]进行如下处理
  16.         for (i = 0; i < 4; i++)
  17.         {
  18.                 for (j = 0; j < 4; j++)
  19.                 {
  20.                         if (a[i][j] == 'y')
  21.                                 for (k = 0; k < 4; k++)
  22.                                 {
  23.                                         if (k == j)
  24.                                                 break;
  25.                                         a[i][k] = 'n';
  26.                                 }
  27.                 }
  28.         }
  29.    
  30.         //打印处理结果
  31.         for ( i = 0; i < 4; i++)
  32.         {
  33.                 for (j = 0; j < 4; j++)
  34.                 {
  35.                         printf("%c", a[i][j]);
  36.                         if ( (j+1) % 4 == 0)
  37.                                 printf("\n");
  38.                 }
  39.         }


  40.         for (i = 0; i < 4; i++)  //假设是第i个人偷的
  41.         {
  42.                 yes = 0;


  43.                 //假设是第i个人偷的,则排除是其他人偷的
  44.                 for (j = 0; j < 4; j++)
  45.                 {
  46.                         if (j != i)
  47.                                 b[j] = 'n';
  48.                         else
  49.                                 b[j] = 'y';
  50.                 }
  51.         
  52.                 //打印假设结果
  53.                 for ( j = 0; j < 4; j++)
  54.                         printf("%c ", b[j]);
  55.                 printf("\n");
  56.                

  57.        //判断第j个人说的对否
  58.                 for (j = 0; j < 4; j++)  
  59.                 {
  60.                         for (k = 0; k < 4; k++)
  61.                         {
  62.                                 if (a[j][k] == 'a')
  63.                                         continue;
  64.                                 if (a[j][k] != b[k])
  65.                                 {
  66.                                         c[j] = 'n';
  67.                                         break;
  68.                                 }
  69.                                 c[j] = 'y';
  70.                         }
  71.                 }


  72.                 //判断这种假设情况下,没有撒谎的人是几个
  73.                 for ( j = 0; j < 4; j++)
  74.                 {
  75.                         if (c[j] == 'y')
  76.                                 yes++;
  77.                 }

  78.                 printf("如果假设是第i=%d个人偷的,说真话的有%d个人\n", i, yes);

  79.                 if (yes == 1)
  80.                 {
  81.                         printf("强盗是第i= %d\n", i);
  82.                 }
  83.                 else
  84.                 {
  85.                         printf("这种假设不成立!\n");
  86.                 }
  87.         }

  88.         return 0;
  89. }
复制代码

[ 本帖最后由 zhuhefang2006 于 2008-6-26 10:07 编辑 ]

论坛徽章:
0
30 [报告]
发表于 2008-06-25 20:57 |只看该作者
晕倒, 我这个题的意思是

把逻辑推理交给计算机,而把逻辑问题本身描述成计算机语言。

你们自己用头脑就已经把它解决了,那编程干嘛?

[ 本帖最后由 yy_galois 于 2008-6-25 20:59 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP