分析完整**
題目描述
這是乙個數三角的遊戲。長度為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 記錄...