BZOJ 1294 圍豆豆 題解

2022-02-04 02:15:13 字數 2253 閱讀 1150

是不是平時在手機裡玩吃豆豆遊戲玩膩了呢?最近mokia手機上推出了一種新的圍豆豆遊戲,大家一起來試一試吧。

遊戲的規則非常簡單,在乙個n×m的矩陣方格內分布著d顆豆子,每顆豆有不同的分值vi。遊戲者可以選擇任意乙個方格作為起始格,每次移動可以隨意的走到相鄰的四個格仔,直到最終又回到起始格。最終遊戲者的得分為所有被路徑圍住的豆豆的分值總和減去遊戲者移動的步數。矩陣中某些格仔內設有障礙物,任何時刻遊戲者不能進入包含障礙物或豆子的格仔。遊戲者可能的最低得分為0,即什麼都不做。

注意路徑包圍的概念,即某一顆豆在路徑所形成的多邊形(可能是含自交的複雜多邊形)的內部。下面有兩個例子:

第乙個例子中,豆在路徑圍成的矩形內部,所以豆被圍住了。第二個例子中,雖然路徑經過了豆的周圍的8個格仔,但是路徑形成的多邊形內部並不包含豆,所以沒有圍住豆子。

布布最近迷上了這款遊戲,但是怎麼玩都拿不了高分。聰明的你決定寫乙個程式來幫助他順利通關。

第一行兩個整數\(n\)和\(m\),為矩陣的邊長。

第二行乙個整數\(d\),為豆子的總個數。

第三行包含\(d\)個整數\(v_1\)到\(v_d\),分別為每顆豆子的分值。

接著\(n\)行有乙個\(n \times m\)的字元矩陣來描述遊戲矩陣狀態,0表示空格,#表示障礙物。而數字19分別表示對應編號的豆子。

僅包含乙個整數,為最高可能獲得的分值。

3 8

330 -100 30

00000000

010203#0

00000000

38
50%的資料滿足\(1 \le d \le 3\)。

100%的資料滿足\(1 \le d \le 9,1 \le n, m \le 10,-10000 \le v_i \le 10000\)。

\(n,m\)的範圍都很小,所以可以直接暴力廣搜,但是儲存狀態不能直接用陣列,處理起來會很麻煩,應該狀態壓縮.

我重點講一下怎麼判斷乙個點是否在多邊形內:

先說結論,從某點向外做射線,若該射線與多邊形相交了奇數次,該點就在該多邊形的內部,否則在外部

下面證明

我們設想這個射線是從這個點出發的一條路徑,在我們沿著這個路徑走的過程中,可以得到以下結論:

由於射線無限長,而多邊形有限,所以射線最後一次與多邊形相交一定是從多邊形內部交到外部,由此可得,倒數第二次相交(如果有的話)一定是從外部交到內部.

所以每交一次內外狀態翻轉,而最後的狀態又是在外部,所以當交奇數次,最開始狀態和最後的狀態相反,即在內部,同理當交偶數次,最開始在外部.

這道題中規定從該點向右的射線為判定線,當你搜尋路徑奇數次相交於點\(i\)的判定線,點\(i\)在路徑多邊形內部,反之在外部.

當這個點的狀態從在外部變成在內部,總分數加上這個點的分值;當這個點的狀態從在內部變成在外部,總分數減去這個點的分值,注意搜尋過程中每走一步總分值要減一.

#include using namespace std;

const int n = 15, m = 1050;

int n, m, d, f[n][n][m], vis[n][n], in[n][n][m], x[n], y[n], bean[n], ans, dx[4] = , dy[4] = ;

struct node ;

queueq;

void solve(int fx, int fy) );

while (!q.empty())

}if (!in[nx][ny][status])

in[nx][ny][status]=1, f[nx][ny][status] = score, q.push((node));}}

for (int i = 0; i < (1 << d); i++)

if (in[fx][fy][i]) ans = max(ans, f[fx][fy][i]);

}int main()

for (int i = 1; i <= n; i++)

for (int j = 1; j <= m; j++)

if (!vis[i][j]) solve(i, j);

printf("%d\n", ans);

return 0;

}

1294 高階機密

很早以前,羅馬人為了在戰爭中傳遞資訊,頻繁地使用替換法進行資訊加密。然而在計算機技術高速發展的今天,這種替換法顯得不堪一擊。因此密碼研究人員正在試圖尋找一種易於編碼 但不易於解碼的編碼規則。目前比較流行的編碼規則稱為rsa,是由美國麻省理工學院的三位教授發明的。這種編碼規則是基於一種求密取模演算法的...

sicily1294 高階機密

time limit 1 secs,memory limit 32 mb 在很多情況下,我們需要對資訊進行加密。特別是隨著internet的飛速發展,加密技術就顯得尤為重要。很早以前,羅馬人為了在戰爭中傳遞資訊,頻繁地使用替換法進行資訊加密。然而在計算機技術高速發展的今天,這種替換法顯得不堪一擊。因...

sicily 1294 高階機密

time limit 1 secs,memory limit 32 mb 在很多情況下,我們需要對資訊進行加密。特別是隨著internet的飛速發展,加密技術就顯得尤為重要。很早以前,羅馬人為了在戰爭中傳遞資訊,頻繁地使用替換法進行資訊加密。然而在計算機技術高速發展的今天,這種替換法顯得不堪一擊。因...