您当前的位置: 首页 > 

寒冰屋

暂无认证

  • 0浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

回溯:解魔方

寒冰屋 发布时间:2020-12-01 11:12:32 ,浏览量:0

目录

介绍

魔方

解决魔方的一个天真的方法:排列

C#程序通过回溯解决魔方

通过生排列换来解决魔方

使用代码

注意事项

  • 下载源代码3.5 KB
介绍

回溯是一种编程技术,用于解决没有已知解决方案的问题。已知解问题的一个例子是计算从1开始的前N个整数的和。它很容易实现为:

int sum = 0;

for ( int i = 1; i  0; --i )
      {
         numbers.Enqueue( i );
      }
      steps = 0L;
      row = col = 0;
      done = false;
      startTime = DateTime.Now;

      PlaceNumber( _params );
      endTime = DateTime.Now;

      if ( !done )
      {
         Console.WriteLine( "\n\n{0} steps", steps );
         Console.WriteLine( "\nNo solution for N = {0} and Magic number = {1}\n",
                            _params.N, _params.MagicNumber );
      }
      ReportTimes( startTime, endTime );
   }
}// SolveSquare

函数InitializeSquare将正方形中的所有元素都设置为零,以指示未放置任何数字,因此此处不会复制。关键函数是PlaceNumber负责尝试解决方案时放置数字,回收已放置的数字以及在回溯期间删除数字。如果PlaceNumber函数的参数中的ShowStep字段设置为true,则在该Console.Write语句的调用中,符号“.{0}”表示已在正方形中放置了一个数字,而符号“ 0 ) && ValidPosition( _params ) ) { n = numbers.Count; k = 0; do { m = numbers.Dequeue(); // Remove number at the head. if ( ( e = square[ row, col ] ) != 0 ) { numbers.Enqueue( e ); // Recycle the current number. } square[ row, col ] = m; // Put the dequeued number in its place. if ( _params.ShowStep ) { Console.Write( ".{0} ", m ); // number placed } ++k; ++steps; if ( SquareOK( _params ) ) { if ( numbers.Count == 0 ) { done = true; ShowSquare( _params ); } else { NextPosition( _params ); // Compute next (row, col) coordinates. PlaceNumber( _params ); // Recursively place another number. } } } while ( k < n && !done ); // k == n || done if ( !done ) // backtrack { numbers.Enqueue( square[ row, col ] ); // Recycle the number at the // current position. if ( _params.ShowStep ) { Console.Write( "

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0872s