計蒜客 阿里的新遊戲

2021-08-16 01:52:34 字數 1378 閱讀 7414

阿里九遊開放平台近日上架了一款新的益智類遊戲——成三棋。成三棋是我國非常古老的乙個雙人棋類遊戲,其棋盤如下圖所示:

如果一條線段上的三個交叉點都被同一玩家的棋子佔據的話,則稱這條線段被該玩家 成三。現在,小紅和小明兩人在遊戲平台上下棋,其中小紅的棋子是黑色的。請你幫小紅計算他成三的線段數。

樣例對應的棋盤如下:

輸入格式

輸入第一行兩個整數 n,m(3 \le n, m \le 9)n,m(3≤n,m≤9),nn 表示小紅的棋子數,mm 表示小明的棋子數。

接下來 nn 行輸入小紅的棋子座標。

接下來 mm 行輸入小明的棋子座標。

輸入保證座標合法,並且棋子之間不重合。

輸出格式

輸出小紅成三的線段數。

樣例輸入

6 3

-1 0

-2 0

-3 0

-1 -1

-1 1

1 0

0 2

0 3

2 2

樣例輸出

2 我的思路比較簡單,先把輸入的資料存放在二維陣列a[10][2]裡,然後分別以行、列的方式遍歷該陣列,對該陣列中橫、縱座標相同的點進行分類,-3到3的7個數字,num[7]對在每一條縱線和橫線上的點進行統計,從而知道每乙個線段方向上有幾個點,b[7][6]則是記錄橫座標或者縱座標相同的點記錄另一維的數字,以便之後判斷是否在一條線段上。

在judge函式裡,如果乙個線段方向上有超過3個點,若這個數字不是0,那麼肯定只有三個點,而且這三個點在一條線段上(從圖里可以看出)。如果這個數字是0,可以對b[i]裡存的數字進行排序,先從小到大,如果前三個數字分別是-3,-2,-1,那麼肯定符合要求,再從大到小排序,如果前三個數字分別是3,2,1,也是符合要求的。之所以進行兩次排序判斷,是因為可能有6個點,在兩條線段上。

**如下:

#include 

#include

using

namespace

std;

int point_num,useless,a[10][2]=,b[7][6]=,so=0;

int num[7]=;

void judge()}}

}void d(int c)

for(i=0;i3;

b[j][num[j]++]=a[i][1-c];

}}int main()

cout

<

蒜頭君的新遊戲 計蒜客

目錄 題目 題解 工作空閒之餘,蒜頭君經常帶著同事們做遊戲,最近蒜頭君發明了乙個好玩的新遊戲 n 位同事圍成乙個圈,同事 a 手裡拿著乙個兔妮妮的娃娃。蒜頭君喊遊戲開始,每位手裡拿著娃娃的同事可以選擇將娃娃傳給左邊或者右邊的同學,當蒜頭君喊遊戲結束時,停止傳娃娃。此時手裡拿著娃娃的同事即是敗者。玩了...

計蒜客習題 蒜頭君的新遊戲

工作空閒之餘,蒜頭君經常帶著同事們做遊戲,最近蒜頭君發明了乙個好玩的新遊戲 n 位同事圍成乙個圈,同事 a 手裡拿著乙個兔妮妮的娃娃。蒜頭君喊遊戲開始,每位手裡拿著娃娃的同事可以選擇將娃娃傳給左邊或者右邊的同學,當蒜頭君喊遊戲結束時,停止傳娃娃。此時手裡拿著娃娃的同事即是敗者。玩了幾輪之後,蒜頭君想...

計蒜客 乘法遊戲

乘法遊戲是在一行牌上進行的。每一張牌包括了乙個正整數。在每乙個移動中,玩家拿出一張牌,得分是用它的數字乘以它左邊和右邊的數,所以不允許拿第1張和最後1張牌。最後一次移動後,這裡只剩下兩張牌。你的目標是使得分的和最小。例如,如果數是10 1 50 20 5,依次拿1 20 50,總分是10 1 50 ...