題意:乙個機械人想越獄,他只能帶一定電量的電池,'s'表示道路可行,'g'表示充電器, 只可充電一次,但是可以經過很多次。'f'表示起點,'y'表示要破壞的機關,也是只能破壞一次,但是可以經過無數次。'd'表示不能經過的地點。求他能 破壞所有機關,帶的最小初始電量。
真是神煩無比啊啊,這題
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;
9#define mod 1000000007
10const
int inf=0x3f3f3f3f;11
const
double eps=1e-5
;12 typedef long
long
ll;13
#define cl(a) memset(a,0,sizeof(a))
14#define ts printf("*****\n");
15const
int maxn=17;16
intn,m,tt;
17int d[4][2]=;
18int dp[1
<19char
s[maxn][maxn];
20int
dist[maxn][maxn][maxn][maxn];
21int
cnt;
22int
start;
23int fin=0;24
bool
vis[maxn][maxn];
25struct
node
26node[maxn],st,ed;
29void bfs(int x,int y) //
x,y點到其他點的距離
3040}41
while(!q.empty()) q.pop();
42node now,next;
43 now.x=x,now.y=y;
44 dist[x][y][x][y]=0;45
q.push(now);
46 vis[x][y]=1;47
while(!q.empty())
4862}63
}64}65
bool check(int
v)6684}
85return0;
86}87int
main()
88103
}104 cnt=0
;105 fin=0
;106
for(i=0;i)
107117
else
if(s[i][j]=='y'
)118
123else
if(s[i][j]=='g'
)124
128}
129}
130int l=0
;131
int r=n*m;
132int ans=-1
;133
while(l<=r)
134141
else l=mid+1
;142
}143 printf("
%d\n
",ans);
144}
145 }
hdu 3681 計算幾何
還是太粗心了阿,求直線上的點到兩點間距離和的最小值 搞了好久阿,a點和b點有可能在直線的同側也可能在異側 view code include include const double eps 1e 9 struct pointa,b,c,a1,node double dis point a,poin...
HDU 3681 bfs 狀壓dp 二分
題目 click 題意 給定乙個n m的地圖,d表示不能走的地方,g補充滿能量,問從f點走完所有的y點最小的能量,走乙個消耗一格能量。注意一下題目中所給的範圍,y g的數量不超過15。在無數條路徑中找出一條最佳路徑,d是不能走的,所需點的數量頂多16個 加上了f點 其實可以發現本質就是乙個tsp的變...
hdu 3681 bfs 二分 狀壓dp判斷
思路 機械人從出發點出發要求走過所有的y,因為點很少,所以就能想到經典的tsp問題。首先bfs預處理出 y f g 之間的最短距離,由於g點可以充電,到達g點就把當前能量更新為電池容量然後繼續走。因為每個g點只能充一次電,這就好像tsp中的每個點只能走一次一樣,然後就是二分答案了,用狀壓dp判定當前...