在 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表示...