日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

bzoj 1295: [SCOI2009]最长距离

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj 1295: [SCOI2009]最长距离 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

1295: [SCOI2009]最長(zhǎng)距離

Time Limit:?10 Sec??Memory Limit:?162 MB
Submit:?1165??Solved:?619
[Submit][Status][Discuss]

Description

windy有一塊矩形土地,被分為 N*M 塊 1*1 的小格子。 有的格子含有障礙物。 如果從格子A可以走到格子B,那么兩個(gè)格子的距離就為兩個(gè)格子中心的歐幾里德距離。 如果從格子A不可以走到格子B,就沒(méi)有距離。 如果格子X(jué)和格子Y有公共邊,并且X和Y均不含有障礙物,就可以從X走到Y(jié)。 如果windy可以移走T塊障礙物,求所有格子間的最大距離。 保證移走T塊障礙物以后,至少有一個(gè)格子不含有障礙物。

Input

輸入文件maxlength.in第一行包含三個(gè)整數(shù),N M T。 接下來(lái)有N行,每行一個(gè)長(zhǎng)度為M的字符串,'0'表示空格子,'1'表示該格子含有障礙物。

Output

輸出文件maxlength.out包含一個(gè)浮點(diǎn)數(shù),保留6位小數(shù)。

Sample Input

【輸入樣例一】
3 3 0
001
001
110


【輸入樣例二】
4 3 0
001
001
011
000


【輸入樣例三】
3 3 1
001
001
001

Sample Output

【輸出樣例一】
1.414214

【輸出樣例二】
3.605551

【輸出樣例三】
2.828427
看起來(lái)不好做, 但是轉(zhuǎn)換一下思路。 我們求出每一個(gè)格子到其他所有格子的最小花費(fèi), 也就是需要移除障礙的個(gè)數(shù)。 然后看這個(gè)數(shù)是否小于等于k, 如果小于, 更新ans。 #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #include <queue> #include <stack> #include <bitset> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, n, a) for(int i = a; i<n; i++) #define fi first #define se second typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int dis[35][35], vis[35][35], a[32][32], n, m; void spfa(int x, int y) {mem2(dis);mem(vis);queue <pll> q;vis[x][y] = 1;dis[x][y] = 0;q.push(mk(x, y));while(!q.empty()) {pll tmp = q.front(); q.pop();vis[tmp.fi][tmp.se] = 0;for(int i = 0; i<4; i++) {x = dir[i][0]+tmp.fi;y = dir[i][1]+tmp.se;if(x>=1&&x<=n&&y>=1&&y<=m) {if(dis[x][y]>dis[tmp.fi][tmp.se]+a[x][y]) {dis[x][y] = dis[tmp.fi][tmp.se]+a[x][y];if(!vis[x][y]) {vis[x][y] = 1;q.push(mk(x, y));}}}}} } double get_dis(int x, int y, int x1, int y1) {return sqrt(1.0*(x-x1)*(x-x1)+(y-y1)*(y-y1)); } int main() {int k;cin>>n>>m>>k;char s[32][32];for(int i = 1; i<=n; i++) {scanf("%s", s[i]+1);}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++)a[i][j] = s[i][j]-'0';}double ans = 0;for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {if(a[i][j])continue;spfa(i, j);for(int x = 1; x<=n; x++) {for(int y = 1; y<=m; y++) {if(dis[x][y]<=k) {ans = max(ans, get_dis(i, j, x, y));}}}}}printf("%.6f\n", ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/yohaha/p/5228935.html

總結(jié)

以上是生活随笔為你收集整理的bzoj 1295: [SCOI2009]最长距离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。