模擬 UVa177 摺紙痕(點,線的繞點旋轉)

2021-08-20 19:24:59 字數 1773 閱讀 7723

本題的思路其實通過觀察圖形,很容易想出來的。即維護兩個點s和rot,每次將整個圖形繞rot點順時針選擇90度,並將rot點更新為旋轉後的s點即可。

關鍵在於橫豎線的表達與資料結構問題。陳鋒所採用的方法是:用start, end, vertical來描述一條線,隨後對線的操作即為對start, end兩個點的操作,以及極其重要的normalize函式。

對於平面幾何點繞點旋轉的方法:

pv = p - r;  //以r為中心,建立相對座標系

p' = point(pv.y, -pv.x);

p' += r; //相對座標係用完,還原

pv = p - r;

p' = point(-pv.y, pv.x);

p' += r;

4.**的輸出,實現了由線到點的轉化,還是值得看一看的,這類橫線豎線的問題uva上有很多。

5.陳鋒大佬**中,對於各種資料結構的宣告和運用,能讓**更易讀,debug起來也方便,應該學習。

// ***** folding, uva177

// 陳鋒,侵刪

#include

#include

#include

#include

#include

#include

#include

#define _for(i,a,b) for( int i=(a); i

using

namespace

std;

struct point

};typedef point vector;

vector operator+ (const vector& a, const vector& b)

vector operator- (const point& a, const point& b)

vector operator* (const vector& a, int p)

bool

operator== (const point& a, const point &b)

bool

operator!= (const point& a, const point &b)

bool

operator

< (const point& p1, const point& p2)

ostream& operator

<

const

int maxn = 13;

struct line

// 規整,保證start在end的左邊或者上邊

void normalize() else

}};int n, linecnt;

vector

lines;

int main()

rot = rotate(s, rot);

}map

char> pc;

for(auto& l : lines)

// cout<

for(int y = maxy; y >= miny; y--)

while(*(buf.rbegin()) == ' ') buf.erase(buf.size()-1);

cout

<

0;}

模擬暴力 uva12108

這道題是紫書第四章的習題,拖了好久了。其實我這裡我用了取巧的方法 我假設如果過去了1e7秒,還沒有出現所有人認真聽課的情況的話,那麼就永遠不會出現所有人認真聽課的情況了,然後ac了。關鍵在於一些細節的處理,比如編號從0開始,初始狀態的處理等等。includeusing namespace std i...

UVA 1589 象棋(模擬)

題目 傳送門 給出乙個象棋的殘局,下一步是黑棋走,判斷黑棋是不是被將死。思路 讀完這個題,知道是乙個模擬題,然後想到用兩個二維陣列來模擬棋盤,乙個 mp陣列 用來存殘局,乙個 res陣列 用來處理紅棋在棋盤上產生的對黑棋的限制。將紅棋的馬 車 炮 將寫成函式來分別處理。這樣處理完之後,判斷一下黑棋的...

Uva 810 DFS 骰子模擬

原題 很有意思的一道題,因為是根據骰子的點數走迷宮,自然就只能一步步模擬了.最大的難題在於怎樣確定骰子旋轉後的情況.由於骰子旋轉之後每個面點數的變化規律比較難找,但由於骰子有六個面,而且每個面的對立面都是固定的,因此只要知道其中兩個位置的點數就可以推斷出整個骰子的點數了。因此可以採用列舉法,也就是可...