JZOJ4016 雅禮聯考DAY01 圈地為王

2021-08-21 11:19:38 字數 2009 閱讀 4643

在 n 行 m 列的網格中,你要圈一些地。

你從左上角出發,最後返回左上角,路徑內部的區域視為被你圈住。 你不可以進入網格內部, 只能在邊上行走。 你的路徑不能在左上角以外自交, 但是邊足夠寬, 你可以重複經過而不自交。

網格中有一些格仔對你很重要,你要盡量圈住它;而另一些格仔對你有壞處,你不能圈住它。

求圈住 i 個重要的格仔的最小路徑長度。

n 行,每行 m 個字元。

『i』表示重要的格仔, 『x』表示有壞處的格仔, 『.』表示其他格仔。

輸出重要的格仔數行, 第 i 行表示圈住 i 個重要的格仔的最小路徑長度。

首先我們需要知道如何判斷乙個點是否在乙個多邊形裡面,

這個很簡單:從這個點引出一條射線,看看它與多邊形的邊有多少個交點,

如果是奇數個,就在多邊形裡面,偶數個就不在。

關於自交的問題,就將它當作沒有自交就好了。

看到資料範圍,特殊點只有很少,考慮如何設狀態, 用f

x,y,

s fx,

y,s表示當前走的點(x,y),特殊格仔上面經過的線的奇偶性的2進製狀態,

有了這個狀態就可以bfs了。

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define n 2560000

#define m 103

#define db double

#define p putchar

#define g getchar

#define inf 998244353

#define pi 3.1415926535897932384626433832795

using namespace std;

char ch;

void read(int &n)

int max(int a,int b)

int min(int a,int b)

ll s

qr(ll x)

void write(ll x)

int f[53][53][1030],n,m,x,y,xx,yy,t,v,ss;

int z[13],fx[4][2]=,,,};

int head,tail,q[3][n*8],ans[13],p[2][13],cnt;

bool bz[53][53][1030];

char s[53][53];

int get(int

x,int

y,int

s)void dfs(int ss,int

x,int

y)int main()

}memset(f,127,sizeof(f));

memset(bz,1,sizeof(bz));

f[0][0][0]=0;bz[0][0][0]=0;n--;

for(head=0,tail=1;headx=q[0][head];

y=q[1][head];

t=q[2][head];

v=f[x][y][t];

for(int k=0;k<4;k++)}}

bz[x][y][t]=1;

}memset(ans,127,sizeof(ans));

dfs(0,1,0);

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

if(ans[i]<1000000)write(ans[i]),p('\n');

return

0;}

JZOJ4015 雅禮聯考DAY01 數列

題目的意思很明確,看看資料範圍就覺得有點神奇,先看前面7個資料,這個就直接模擬就好了。在看8 14,此時的模數比較小,就知道應該是找迴圈節。然後就只剩下最後的了,有個特殊條件,看看怎樣利用,利用一下費馬小定理,就愉快地解決了這題。include include define ll long long...

雅禮聯考DAY2總結

成功被flag。並沒有翻盤。了。又是60分,mdzz。其實我今天不是很懂怎麼回事。第一題被卡log丟了40分,第二題被卡空間掉了50分,生無可戀。day1也是。t2網路掛了丟了100分,t3開小了掛了40分。如果網路正常。如果我空間開的正常點,不要老想著多水分。我就是高一第7了。感覺以前太浪,什麼做...

雅禮聯考DAY02 Path

給定乙個 n m 的網格,你在左下角 n,1 你只能往前走或者右拐,障礙和走過的點不能走。求走到 y,x 的方案數 mod k 的值。n,m 100,k 10 9.考慮當前走到了乙個點,剩下的能走的範圍是乙個矩形。於是倒著dp,設fp x1,y1,x 2,y2 f p,x1,y 1,x2 y 2表示...