鱼C论坛

 找回密码
 立即注册
查看: 4212|回复: 11

[争议讨论] 算法每日一个(九)——___回溯法

[复制链接]
发表于 2011-7-12 09:52:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题:应用回溯法求解四皇后问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 09:53:35 | 显示全部楼层
本帖最后由 asd82937121 于 2011-7-12 09:54 编辑

不应该是八皇后吗?  L哥的意思是不是 棋盘也变成4*4的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-7-12 12:00:47 | 显示全部楼层

yes,说的对,本身皇后问题就是在N X N 的棋盘上进行的,对于此类问题的解决办法也不唯一,回溯法只是其中一种。可以考虑下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 13:27:58 | 显示全部楼层
直到现在回溯法都不是太明白  自己看了好长时间写出来的还木有反应  真不知道该怎么搞这种算法, L哥能给指点指点么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-12 13:28:48 | 显示全部楼层
最近有点事,都没过来,今天继续、、
  1. /*
  2. **        Slove the 4 queen problem
  3. **        By chao_prince
  4. **        7/12/11
  5. */

  6. #include <stdio.h>
  7. #include <stdlib.h>

  8. #define TRUE 1
  9. #define FALSE 0

  10. int board[4][4];

  11. void print_board()
  12. {
  13.         int row;
  14.         int column;
  15.         static int n_soluctions;

  16.         n_soluctions += 1;

  17.         printf( "Soluctions #%d:\n", n_soluctions );

  18.         for( row = 0; row < 4; row += 1 )
  19.         {
  20.                 for( column = 0; column < 4; column += 1 )
  21.                 {
  22.                         if( board[row][column] )
  23.                                 printf( " Q" );
  24.                         else
  25.                                 printf( " +" );
  26.                 }
  27.                 putchar( '\n' );
  28.         }
  29.         putchar( '\n' );
  30. }

  31. int conflicts( int row, int column )
  32. {
  33.         int i;

  34.         for( i = 1; i < 4; i++ )
  35.         {
  36.                 if( row - i >= 0 && board[row-i][column] )
  37.                         return TRUE;
  38.                 if( column - i >= 0 && board[row][column-i] )
  39.                         return TRUE;
  40.                 if( column + i < 4 && board[row][column+i] )
  41.                         return TRUE;

  42.                 if( row - i >= 0 && column - i >= 0
  43.                         && board[row-i][column-i] )
  44.                         return TRUE;
  45.                 if( row - i >= 0 && column + i < 4
  46.                         && board[row-i][column+i] )
  47.                         return TRUE;
  48.         }
  49.         return FALSE;
  50. }

  51. void place_queen(int row)
  52. {
  53.         int column;
  54.        
  55.         for( column = 0; column < 4; column += 1 )
  56.         {
  57.                 board[row][column] = TRUE;
  58.                 if( row == 0 || !conflicts(row, column) )
  59.                 {
  60.                         if( row < 3 )
  61.                                 place_queen(row+1);
  62.                         else
  63.                                 print_board();
  64.                 }
  65.                 board[row][column] = FALSE;
  66.         }
  67. }

  68. int main()
  69. {
  70.         place_queen(0);

  71.         return 0;
  72. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-13 23:27:14 | 显示全部楼层
等 这几天忙完了  回来好好看一遍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-7-20 22:59:58 | 显示全部楼层
本帖最后由 紫色枫叶 于 2011-7-20 23:09 编辑
chao_prince 发表于 2011-7-12 13:28
最近有点事,都没过来,今天继续、、

恩,这个算法是经典算法,记得以前学java的时候看过。差不多都还给老师了。经你这么一写,醍醐灌顶。我在你的代码基础上稍微做了些修改。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. #define TRUE 1
  4. #define FALSE 0

  5. int **board;

  6. void print_board(int n)
  7. {        
  8.     int row;
  9.     int column;
  10.     static int n_soluctions;
  11.     n_soluctions += 1;
  12.     printf( "Soluctions #%d:\n", n_soluctions );
  13.     for( row = 0; row < n; row += 1 )
  14.     {
  15.          for( column = 0; column < n; column += 1 )
  16.         {
  17.             if( board[row][column] )
  18.                printf( " Q" );
  19.             else
  20.                 printf( " +" );
  21.         }
  22.                 putchar( '\n' );
  23.     }
  24.     putchar( '\n' );
  25. }

  26. int conflicts(int row, int column, int n)
  27. {

  28.     int i;
  29.     for( i = 1; i < n; i++ )
  30.     {
  31.         if(row - i >= 0 && board[row-i][column])           
  32.             return TRUE;
  33.         if(column - i >= 0 && board[row][column-i])
  34.             return TRUE;
  35.         if(column + i < n && board[row][column+i])
  36.             return TRUE;
  37.         if(row - i >= 0 && column - i >= 0
  38.             && board[row-i][column-i])
  39.                         return TRUE;
  40.         if(row - i >= 0 && column + i < n
  41.             && board[row-i][column+i])
  42.             return TRUE;
  43.     }
  44.     return FALSE;
  45. }

  46. void place_queen(int row, int n)
  47. {
  48.     int column;
  49.     for(column = 0; column < n; column += 1)
  50.     {        
  51.         board[row][column] = TRUE;
  52.         if(row == 0 || !conflicts(row, column, n))
  53.         {                                                   
  54.             if(row < n - 1)
  55.                 place_queen(row+1, n);
  56.             else
  57.                print_board(n);
  58.         }
  59.         board[row][column] = FALSE;
  60.     }
  61. }

  62. int main(int argc, char **argv)
  63. {
  64.         printf("请输入皇后数(偶数):");
  65.         int n = 0;
  66.         scanf("%d", &n);
  67.         board = new int*[n];
  68.         for(int i = 0; i < n; i++)
  69.         {
  70.                 board[i] = new int[n];
  71.         }
  72.         
  73.         for(int i = 0; i < n; i++)
  74.         {
  75.                 for(int j = 0; j < n; j++)
  76.                         board[i][j] = FALSE;
  77.         }
  78.         place_queen(0, n);
  79.         for(int i = 0; i < n; i++)
  80.         {
  81.                delete [] board[i];
  82.                board[i] = NULL;
  83.         }
  84.         delete []board;
  85.         board = NULL;
  86.         system("pause");
  87.         return 0;
  88. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-11-1 18:39:13 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-9-9 12:17:11 | 显示全部楼层
一起加油,为了鱼C美好的明天!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-16 20:29:02 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-17 08:53:44 | 显示全部楼层
好文章转过来方便自己看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-2 16:17:35 | 显示全部楼层
学习学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 01:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表