–開始一看,這不是走迷宮嗎,那就是bfs呀,當然是快樂gg了
誰能想到這是一道圖論題呢(反正不是本蒟蒻)
我們把每個空位和上下左右連一條長為1的邊
和上下左右的第一堵牆連一條長為與最近的牆的距離的邊
然後從起點開始,跑一遍spfa就行了
細節問題不一定相同
像找最近的牆時
可以bfs
也可以和我一樣找菱形
要看**能力呢
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=505;
int n,m;
char g[maxn][maxn];
int g[maxn][maxn];
int node;
int begin,end;
struct heheedge[maxn*maxn*8];
int e;
vector
a[maxn*maxn];
queue
q;bool isv[maxn*maxn];
int d[maxn*maxn];
int near(int x,int y)
while(y!=y)
while(x!=x)
while(y!=y)
}return step;
}void lb(int x,int y)
if(g[x+1][y]!='#')
if(g[x][y-1]!='#')
if(g[x][y+1]!='#')
int l=near(x,y);
int x=x,y=y;
while(g[x][y]!='#')
x--;
x++;
int v=g[x][y];
e++;
edge[e].u=u;
edge[e].v=v;
edge[e].l=l;
a[u].push_back(e);
x=x,y=y;
while(g[x][y]!='#')
x++;
x--;
v=g[x][y];
e++;
edge[e].u=u;
edge[e].v=v;
edge[e].l=l;
a[u].push_back(e);
x=x,y=y;
while(g[x][y]!='#')
y--;
y++;
v=g[x][y];
e++;
edge[e].u=u;
edge[e].v=v;
edge[e].l=l;
a[u].push_back(e);
x=x,y=y;
while(g[x][y]!='#')
y++;
y--;
v=g[x][y];
e++;
edge[e].u=u;
edge[e].v=v;
edge[e].l=l;
a[u].push_back(e);
}void spfa()}}
}}int main()
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]!='#')
lb(i,j);
spfa();
if(d[end]==0x3f3f3f3f)
cout
<
else
cout
0;}
SPFA JZOJ 5781 秘密通道
description 有一副n m的地圖,有n m塊地,每塊是下列四種中的一種 牆 用 表示,牆有4個面,分別是前面,後面,左面,右面。起點 用c表示,為主角的起點,是一片空地。終點 用f表示,為主角的目的地,是一片空地。空地 用 表示。其中除了牆不能穿過,其他地方都能走。主角有以下3種操作 1....
Google的秘密通道
微軟風格的入口 mac風格的入口 linux風格的入口 freebsd風格的入口 google有各種語言的版本,下面這些語言可能實在是稀罕了點兒 克林岡語入口 沒看過星際旅行嗎?政治入口 宗教入口 小豬入口 黑客專用入口 google裡還有乙個小小的彩蛋遊戲,大家自己去看吧!下面是一此更有用的彩蛋 ...
大獎賽 秘密資訊
30爆搜,60 01揹包,100折半搜尋。01揹包 dp j 表示在j錢下最多有多少種方案。dp j dp j a i 01揹包要倒推,否則會導致狀態的混亂。include include define ll long long using namespace std ll a 50 ll dp 1...