本題的思路其實通過觀察圖形,很容易想出來的。即維護兩個點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 骰子模擬
原題 很有意思的一道題,因為是根據骰子的點數走迷宮,自然就只能一步步模擬了.最大的難題在於怎樣確定骰子旋轉後的情況.由於骰子旋轉之後每個面點數的變化規律比較難找,但由於骰子有六個面,而且每個面的對立面都是固定的,因此只要知道其中兩個位置的點數就可以推斷出整個骰子的點數了。因此可以採用列舉法,也就是可...