C / C ++中的模拟算法实现

时间:2017-09-18 16:18:49

标签: c implementation

让一排8000盏灯。最初,只有位于左侧的那个点亮。 然后,每隔一秒,执行以下操作:如果左侧的灯在之前点亮一秒,则每个灯改变状态(开或关)。最左边的灯一直亮着。此操作是即时的。 当右侧灯泡第一次亮起时,此过程停止。 有多少盏灯?

我对以下问题的实施是错误的,你能帮助我吗?

#include <cstdio>

int t[8001][2];

int main()
{
    t[1][0] = 1;
    t[1][1] = 1;
    int cpt1 = 0, ip = 0;
    while (t[8000][0] != 1 && t[8000][1] != 1)
    {
        ip++; 
        for (int j=2;j<8001;j++)
        {
            if(t[j-1][!(ip&1)])
                t[j][(ip & 1)] = !t[j][!(ip & 1)];      
        }
    }   

    for(int j = 1;j < 8001; j++)
        cpt1 += t[j][1];

    printf("cpt=%d\n", cpt1);
}

2 个答案:

答案 0 :(得分:3)

当左边没有改变时,代码缺少更新。

简化代码(基于零的偏移,使用bool)并在下面更正

#include<stdbool.h>
#include<stdio.h>
#define N 8000

bool t[N][2];

int main(void) {
  t[0][0] = true;
  t[0][1] = true;
  int ip = 0;

  while (t[N - 1][0] == 0 && t[N - 1][1] == 0) {
    ip = !ip;
    for (int j = 1; j < N; j++) {
      if (t[j - 1][!ip]) {
        t[j][ip] = !t[j][!ip];
      } else {
        t[j][ip] = t[j][!ip];  // add
      }
    }
  }

  int cpt1 = 0;
  for (int j = 0; j < N; j++) {
    cpt1 += t[j][1];
  }
  printf("N=%d cpt=%d\n", N, cpt1);
  return 0;
}

输出

N=8000 cpt=2048

答案 1 :(得分:2)

以下提议的代码:

  1. 干净地编译
  2. 使用C头文件而不是C ++头文件
  3. 执行所需的操作,但不是最快的算法
  4. 是自由评论的
  5. 现在建议的代码:

    #include <stdio.h>
    
    int t1[8000];   // initially all zeros
    int t2[8000];
    
    
    int main( void )
    {
        // setup initial conditions
        int numLitLights = 0;
        t1[0] = 1;
    
    
        // while stop condition not true
        while ( t1[7999] != 1 )
        {
            // make one pass through lamps
            // update values
            for (int j=0; j<7999; j++)
            {
                if( t1[j] )
                {
                    t2[j+1] = ( t1[j+1] )? 0 : 1;
                }
            }
    
            // update original
            for( int j=0; j< 8000; j++ )
            {
                t1[j] = t2[j];
            }
        }
    
        // count lit lamps
        for(int j = 0; j < 8000; j++)
        {
           if( t1[j] )
           {
               numLitLights++;
           }
        }
    
        // output number of lit lamps
        printf( "number of lit lamps: %d\n", numLitLights );
    } // end function: main
    

    结果(点亮的灯数)是

    1024