鱼C论坛

 找回密码
 立即注册
查看: 3344|回复: 4

今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:

[复制链接]
发表于 2013-6-15 00:22:51 | 显示全部楼层 |阅读模式

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

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

x
今有 6 x 6 的棋盘格。其中某些格子已经预先放好了棋子。现在要再放上去一些,使得:每行每列都正好有3颗棋子。我们希望推算出所有可能的放法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-15 00:24:34 | 显示全部楼层
注解:蓝桥的初赛题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:30:54 | 显示全部楼层
有人知道这个算法吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:34:49 | 显示全部楼层
  1. int N = 0;

  2. bool CheckStoneNum(int x[][6])
  3. {
  4.         for(int k=0; k<6; k++)
  5.         {
  6.                 int NumRow = 0;
  7.                 int NumCol = 0;
  8.                 for(int i=0; i<6; i++)
  9.                 {
  10.                         if(x[k][i]) NumRow++;
  11.                         if(x[i][k]) NumCol++;
  12.                 }
  13.                 if(NumRow!=3 || NumCol!=3) return false;  
  14.         }
  15.         return true;
  16. }

  17. int GetRowStoneNum(int x[][6], int r)
  18. {
  19.         int sum = 0;
  20.         for(int i=0; i<6; i++)         if(x[r][i]) sum++;
  21.         return sum;
  22. }

  23. int GetColStoneNum(int x[][6], int c)
  24. {
  25.         int sum = 0;
  26.         for(int i=0; i<6; i++)         if(x[i][c]) sum++;
  27.         return sum;
  28. }

  29. void show(int x[][6])
  30. {
  31.         for(int i=0; i<6; i++)
  32.         {
  33.                 for(int j=0; j<6; j++) printf("%2d", x[i][j]);
  34.                 printf("\n");
  35.         }
  36.         printf("\n");
  37. }

  38. void f(int x[][6], int r, int c);

  39. void GoNext(int x[][6],  int r,  int c)
  40. {
  41.         if(c<6)
  42.                 f(x,r,c+1);   
  43.         else
  44.                 f(x, r+1, 0);
  45. }

  46. void f(int x[][6], int r, int c)
  47. {
  48.         if(r==6)
  49.         {
  50.                 if(CheckStoneNum(x))
  51.                 {
  52.                         N++;
  53.                         show(x);
  54.                 }
  55.                 return;
  56.         }

  57.         if(x[r][c])  // 已经放有了棋子
  58.         {
  59.                 GoNext(x,r,c);
  60.                 return;
  61.         }
  62.        
  63.         int rr = GetRowStoneNum(x,r);
  64.         int cc = GetColStoneNum(x,c);

  65.         if(cc>=3)  // 本列已满
  66.                 GoNext(x,r,c);  
  67.         else if(rr>=3)  // 本行已满
  68.                 f(x, r+1, 0);   
  69.         else
  70.         {
  71.                 x[r][c] = 1;
  72.                 GoNext(x,r,c);
  73.                 x[r][c] = 0;
  74.                
  75.                 if(!(3-rr >= 6-c || 3-cc >= 6-r))  // 本行或本列严重缺子,则本格不能空着!
  76.                         GoNext(x,r,c);  
  77.         }
  78. }

  79. int main(int argc, char* argv[])
  80. {
  81.         int x[6][6] = {
  82.                 {1,0,0,0,0,0},
  83.                 {0,0,1,0,1,0},
  84.                 {0,0,1,1,0,1},
  85.                 {0,1,0,0,1,0},
  86.                 {0,0,0,1,0,0},
  87.                 {1,0,1,0,0,1}
  88.         };

  89.         f(x, 0, 0);
  90.        
  91.         printf("%d\n", N);

  92.         return 0;
  93. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-6-15 18:46:40 | 显示全部楼层
希望有人能解析一下这个代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 20:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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