下過中國象棋的朋友都知道,雙方的將帥相隔遙遠,並且不能照面,且將和帥分別限制在3*3的小格子裡面。那麼有這樣一個問題:
假設A、B分別代表將和帥,請寫出一個程式,輸出A、B所有的合法位置。要求在程式碼中只能使用一個位元組儲存變數。
問題分析:其實問題本身並不複雜。只要把所有A、B相互排斥的條件列舉出來即可完成本題目的要求。由於本題目要求只能用一個變數,所以首先要考慮清楚,有哪些資訊需要儲存。並且儘量高效的儲存資訊。這個程式的大體框架是:
遍歷A的位置,遍歷B的位置,判斷A、B位置組合是否滿足要求,如果滿足,則輸出。
下面給出幾個解法:
解法一:C#程式碼實現:
using System;
namespace ConsoleApp1{
class Program
{
static void Main(string[] args)
byte i = 81;
while (i——>0)
if (i / 9 % 3 == i % 9 % 3)
continue;
}
Console。WriteLine($“A={i/9+1},B={i%9+1}”);
該解法輸出的結果為:
輸出結果
解法二:C++程式碼實現。該解法據說比第一種解法效率要高。有興趣的讀者可以證明一下。
struct
unsigned char a : 4;
unsigned char b : 4;
}i;
for (i。a = 1; i。a < =9; i。a++){
for (i。b = 1; i。b <= 9; i。b++)
{
if(i。a%3!=i。b%3)
printf(“A=%d,B=%d\n”,i。a,i。b)
}}
此外,該演算法還有其他的解法。據說有位面試者給出了比標準答案還要簡明的答案。因此被微軟錄取了。如果讀者有更好的解法,可以在評論區留下自己的程式碼,和大家分享。
關於本書的其他解法,可以參考《程式設計之美》1。2節的詳細介紹。喜歡的朋友可以檢視下方連結。
程式設計之美 微軟技術面試心得
檢視