USACO 1.4 Wormholes 蟲洞
題目描述
農夫約翰愛好在週末進行高能物理實驗的結果卻適得其反,導致N個蟲洞在農場上(2<=N<=12,n是偶數),每個在農場二維地圖的一個不同點。
根據他的計算,約翰知道他的蟲洞將形成 N/2 連線配對。例如,如果A和B的蟲洞連線成一對,進入蟲洞A的任何物件體將從蟲洞B出去,朝著同一個方向,而且進入蟲洞B的任何物件將同樣從蟲洞A出去,朝著相同的方向前進。這可能發生相當令人不快的後果。
例如,假設有兩個成對的蟲洞A(1,1) 和 B(3,1),貝茜從(2,1)開始朝著 +x 方向(右)的位置移動。貝茜將進入蟲洞 B(在(3,1)),從A出去(在(1,1)),然後再次進入B,困在一個無限迴圈中!
| . . . . | A > B . 貝茜會穿過B,A, + . . . . 然後再次穿過B
農夫約翰知道他的農場裡每個蟲洞的確切位置。他知道貝茜總是向 +x 方向走進來,雖然他不記得貝茜的當前位置。請幫助農夫約翰計算不同的蟲洞配對(情況),使貝茜可能被困在一個無限迴圈中,如果她從不幸的位置開始。
樣例輸入&輸出
sample input
4 0 0 1 0 1 1 0 1
sample output
2
分析&反思
dfs + 模擬檢驗,都有需要提高的地方
剛開始想到了一個簡單剪枝,想到了dfs配對,想到了向大配對去重, 想到了從蟲洞出發檢查。
想不到dfs的程式碼實現,想不到partner陣列 ,想不到right陣列記錄右邊的點直接跳。
dfs很久沒寫了,基本的幾點:
1. 終點狀態,ans++,return ans。
2. 退出後partner還原為零。
ps:right是一個string類的函式,屬於關鍵字, 不可用於命名。補充:
CString a,b;
a = "123456789";
b = a.Left(4); //值為:1234
b = a.Mid(3); //值為:456789
b = a.Mid(2, 4); //值為:3456 //4為長度
b = a.Right(4); //值為:6789
程式碼
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int x[20], y[20], partner[20], right1[20];
int check() {
int pos, start;
for(int i = 1; i <= n; i++) {
pos = start = i;
for(int cnt = 0; cnt < n; cnt++) {
pos = partner[right1[pos]];
if(pos == start) return 1;
if(!pos) break;
}
}
return 0;
}
int solve () {
int i ,j, ans = 0; //int ans = 0
for(i = 1; i <= n; i++) if(!partner[i]) break;
if(i == n+1)
if(check()) return ++ans; // i在最後一個迴圈變成n+1,終點狀態
// 向大的匹配,去重,想到了,如同分蘋果,dfs常用去重
for(j = i+1; j <= n; j++)
if(!partner[j]) {
partner[i] = j;
partner[j] = i;
ans += solve(); // +=!!!
partner[i] = partner[j] = 0;
}
return ans;
}
int main () {
freopen("wormhole.in", "r", stdin);
freopen("wormhole.out", "w", stdout);
cin >> n;
for(int i = 1; i <= n; i++) cin >> x[i] >> y[i];
// 記錄每個點右邊的點,直接跳;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(y[i] == y[j] && x[i] < x[j]) // 必須j在i的右邊,順便去掉ij相同的情況
if(!right1[i] || x[right1[i]]-x[i] > x[j]-x[i]) right1[i] = j;
cout << solve() << endl;
return 0;
}
備註
solve () 裡的 i 用的很巧妙。
很多還要重新pick up啊!
相關文章
- 「日常訓練」「小專題·USACO」 Wormholes(1-4)Worm
- USACO 1.4 Barn Repair 修理牛棚 (動態規劃)AI動態規劃
- POJ3259-WormholesWorm
- Python爬蟲— 1.4 正規表示式:re庫Python爬蟲
- 1.4
- POJ 3259-Wormholes(簡單判負環)Worm
- POJ3259 Wormholes【判斷是否有負環】Worm
- 蟲洞怎麼樣,用於遠端連線 iphone 進行測試iPhone
- 引力波探測器能揭示蟲洞存在 人類能前往另一個宇宙
- Sentry 開發者貢獻指南 - 前端 React Hooks 與蟲洞狀態管理模式前端ReactHook模式
- 人工智慧計算中心,助力數字經濟發展的算力“蟲洞”人工智慧
- 樹洞05
- 樹洞01
- 樹洞07
- 樹洞02
- 1.4 - logistic迴歸
- WebGL three.js學習筆記 使用粒子系統模擬時空隧道(蟲洞)WebJS筆記
- [USACO20OPEN] Exercise P
- coding第10天1.4
- 從機器到智慧生命體,操縱汽車的YOYO正在開啟未來的蟲洞
- [USACO15JAN]Moovie Mooving G
- 1.4 - Laravel 5.6 - Share 機制Laravel
- 05--JavaScript--1.4迴圈JavaScript
- Kotlin 1.4的Dokaa Alpha版Kotlin
- 【Basic Abstract Algebra】Exercises for Section 1.4
- [USACO23DEC] Minimum Longest Trip G3D
- What's new of dubbogo v1.4Go
- P1884 [USACO12FEB] Overplanting S
- P1353 [USACO08JAN] Running S
- 【二分】[USACO 2010 Feb S]Chocolate Eating
- P4824 [USACO15FEB] Censoring S
- [USACO20FEB]Equilateral Triangles P 題解UI
- 洞明 Unity ECS 基礎概念Unity
- 1.4 常用HTML標籤3:表單HTML
- 1.4 區塊鏈架構特點區塊鏈架構
- 大系統觀:1.4時間之矢
- Kotlin 1.4-M2正式釋出Kotlin
- Kotlin 1.4-M1正式釋出Kotlin