數三角 題解

2021-10-08 12:39:23 字數 3328 閱讀 8674

分析完整**

題目描述

這是乙個數三角的遊戲。長度為1或sqrt(2)的小木棍放在乙個網格上。如圖所示,有水平的,垂直的或對角的。對角放置的木棍可以交叉。

將木棍隨意地放在網格上得到的圖案可能不含三角形,也可能含乙個或多個三角形。如下圖所示,

輸入格式

輸入檔案count.in包括n+1行:

先輸入圖案中木棍的個數n。下面輸入這n根木棍的位置,用兩個網格座標表示,這兩個座標分別為木棍兩端的位置。網格大小不超過10´10,因此網格左下和右上的座標分別為(0,0)和(9,9)。

輸出格式

輸入檔案count.out包括1行:

三角形的個數。

樣例樣例輸入

30 0 0 1

0 0 1 0

0 1 1 0

樣例輸出我在考試時的思路是定義乙個三維陣列g[x

][y]

[sta

te]g[x][y][state]

g[x][y

][st

ate]

表示取火柴棒較上的端點的位置,sta

testate

stat

e表示擺放的狀態 : 1 -> 向左傾斜 2 -> 向右傾斜 3 -> 垂直於網格線 4 -> 平行於網格線

但我在實現的過程中發現了問題,如果在端點離得比較遠的時候,列舉會很浪費時間,並且能夠構成三角形的組合非常多,不易寫出**,除錯程式會變得非常的麻煩。

考試後看了ljs

ljslj

s的**後又重新理了一下思路:

此題的步驟大致分成三個板塊 :

預處理1.將輸入座標依次擴大兩倍

如下圖:

這樣的話就可以判斷如小圖中對角線交叉,可以使得對對角線的交點處於網格上。

在一次判斷兩點之間的關係

2.標記所連線的線段是對角線還是在網格線上面。

參考**如下(比較累贅):

for

(int i =

1;i <= n; i++)if

(a1 == a3)}if

(a1 + a2 - a3 - a4 ==2)

if(a1 == a3)}if

(a1 + a2 - a3 - a4 ==4)

if(a3 + a4 - a1 - a2 ==4)

if(a1 + a2 == a3 + a4)

map[a1]

[a2]

[a3]

[a4]=1

;//將已經給出的兩點連在一起

map[a3]

[a4]

[a1]

[a2]=1

;}

求出連通性

參考f lo

ydfloyd

floy

d演算法的思想:

列舉中轉點i

ii與和它相連線的另外兩個不同於中轉點沒有連線的節點z

zz,j

jj,判斷兩點之間的可連性(三點共線),如果可以,就將其連線。

可連性判斷:

( z1

−i1)

∗(j−

i)−(

j1−i

1)∗(

z−i)

==0(z1 - i1) * (j - i) - (j1 - i1) * (z - i) == 0

(z1−i1

)∗(j

−i)−

(j1−

i1)∗

(z−i

)==0

for

(int i =

0; i <=

18; i++)}

}}}}

}

判斷是否構成三角形

判斷方式:暴力列舉三角形的三個端點,如果三點之間能夠相連,那麼能夠組成三角形,就ans

++ans++

ans++。

在輸出時應該注意要將ans

/6ans / 6

ans/

6,因為在列舉三個端點會出現重複,根據乘法原理可知,ans

ansan

s的列舉將會重複3∗2

∗13 * 2 * 1

3∗2∗1次。

for

(int i =

0; i <=

18; i++)}

}}}}

} ans /=(

3*2*1);

#include

#include

#include

using

namespace std;

const

int maxn =35;

bool map[maxn]

[maxn]

[maxn]

[maxn]

;int n, ans;

intmain()

if(a1 == a3)}if

(a1 + a2 - a3 - a4 ==2)

if(a1 == a3)}if

(a1 + a2 - a3 - a4 ==4)

if(a3 + a4 - a1 - a2 ==4)

if(a1 + a2 == a3 + a4)

map[a1]

[a2]

[a3]

[a4]=1

;//將已經給出的兩點連在一起

map[a3]

[a4]

[a1]

[a2]=1

;}for(

int i =

0; i <=

18; i++)}

}}}}

}for

(int i =

0; i <=

18; i++)}

}}}}

} ans /=(

3*2*

1);printf

("%d\n"

, ans)

;return0;

}

三角數塔問題

數塔問題 912 15 10 6 8 2 18 9 5 19 7 10 4 16 有形如圖所示的數塔,從頂部出發,在每一結點可以選擇向左走或是向右走,一直走到底層,要求找出一條路徑,使路徑上的值最大。或者是從低往上走,使路徑上的值最大。下面 是從下往上走,要找到從下往上找,用陣列一存就行。inclu...

蛇形三角填數

跟蛇形填數一樣,只是填數要求按照三角形填。注意每組資料之間用空行隔開 第一行有乙個n,表示n組測試資料 接下來每組資料報括乙個數字x,表示三角形的邊長,0 x 1000 輸出之後填好之後的圖 首先找出圖形的特點 對稱性等 與迴圈變數 行號,列號 之間的關係.我們可以假設行用i表示,列用j表示.我們的...

符號三角形題解

聽說有大佬覺得我發題面出來在湊字數,那就不發了吧 符號三角形 看到題目,爆搜,不用想太多,先來試一試。寫的很 醜 麻煩,後面的 會慢慢變簡潔,大佬勿噴 include define zong n n 1 4 const int maxn 105 int n int ans maxn ans i 記錄...