《編程之美》讀書筆記(1)--中國象棋將帥問題

中國象棋將帥問題由於比較簡單,該問題的具體描述是:(根據中國象棋的基本原則)在只有將帥棋盤上,找出所有雙方可以落子的位置(將帥不能碰面),但只能使用一個變量。直覺上我們想到,只要遍歷將帥所有可能的位置,去除將帥衝突的位置即可。可見,剩下的問題就在於如何使用一個變量來做二重循環的遍歷。書中解法一給出的方法是將一個Byte變量拆成兩個用,前一半代表“帥”可以走的位置,後一個變量代表“將”可以走的位置(事先已經將“將”和“帥”可以走的3*3的位置進行了編號),利用位操作即可獲得兩個計數器的功能。書中的解法三採用結構體來解決一個變量遍歷二重循環的問題,思想上換湯不換藥。真正有趣的是解法二,它的代碼如下:

  int var = 81;
  while( var-- )
  {
    if( var / 9 % 3 == var % 9 % 3 )//發生衝突
     continue;
    else
    printf(/** 打印可行的位置 **/);
  }
“將”和“帥”各在自己的3*3的格子間裏面走動,共需要驗證9*9=81種位置關係,我們可以將這一關係想象成9*9的x,y的二維矩陣。如何利用一次循環遍歷9*9矩陣?並不難:x= i/9;y=i%9 完成了這一過程。那麼什麼情況下發生衝突?當x,y處於同一列時發生衝突。

這個問題將會有一個引申,如果存在三層循環,如何處理,很簡單,記住這一公式:當前位置index_x=i/(yx);index_y=i/z%y;index_z=i%z.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章