每天資訊微軟中國程式演算法面試題,中國象棋將帥問題求解

菜單

微軟中國程式演算法面試題,中國象棋將帥問題求解

下過中國象棋的朋友都知道,雙方的將帥相隔遙遠,並且不能照面,且將和帥分別限制在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節的詳細介紹。喜歡的朋友可以檢視下方連結。

微軟中國程式演算法面試題,中國象棋將帥問題求解

程式設計之美 微軟技術面試心得

檢視