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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))

發(fā)布時間:2024/4/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k)) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:

這題如果沒有時間限制的話暴力可以解,暴力的話時間復(fù)雜度大概是O(k*n),1s的話非常懸。

所以我們需要換個思路,我們對每個點預(yù)處理四個方向最多能走的步數(shù),這個預(yù)處理時間復(fù)雜度是O(n*m)。

然后對每個字母點模擬一下即可。總時間復(fù)雜度O(n*m+k)。不會超時。

提示:沒有滿足要求的點時,要輸出”no solution”,我就在這個上面WA了一次,不然應(yīng)該可以一次AC的。

代碼:

#include <iostream> #include <algorithm> #include <stdio.h> #include <vector> #include <map> #include <set> #include <list> #include <queue> using namespace std; typedef long long ll; #define INF 2147483647// 上N,下S,右E,左W。//輸入 int n,m,k; char a[1010][1010]; struct node1{int dir;int len; }t[100010];//b[i][j][k]表示點(i,j)往方向k最多可以走的步數(shù)。 int b[1010][1010][4]; //字母點 struct node{int x;int y;char g;bool operator<(node b){return g < b.g;} }; list <node> l; list <node>::iterator it;int d[4][2] = {-1,0,1,0,0,1,0,-1};//模擬q這個點走的過程 bool can(node q) {int x = q.x;int y = q.y;for(int i = 0;i < k; i++){ node1 s = t[i];if(b[x][y][s.dir] < s.len) return false;x = x + d[s.dir][0]*s.len;y = y + d[s.dir][1]*s.len;}return true; }int main(){//輸入數(shù)據(jù) cin >> n >> m;node e;for(int i = 1;i <= n; i++) {for(int j = 1;j <= m; j++) {cin >> a[i][j];if(a[i][j] != '#' && a[i][j] != '.'){e.x = i; e.y = j; e.g = a[i][j];l.push_back(e);}}}//對子母點按字典序排序 l.sort();for(int j = 1;j <= m; j++){//預(yù)處理每個點最多能往北邊走多少步 int num = 0;for(int i = 1;i <= n; i++){if(a[i][j] != '#'){b[i][j][0] = num;num++;}else{num = 0;}}//預(yù)處理每個點最多能往南邊走多少步num = 0;for(int i = n; i >= 1; i--){if(a[i][j] != '#'){b[i][j][1] = num; num++;}else{num = 0;}}}for(int i = 1; i <= n; i++){//預(yù)處理每個點最多能往東邊走多少步int num = 0;for(int j = 1;j <= m; j++){if(a[i][j] != '#'){b[i][j][3] = num; num++;}else{num = 0;}}//預(yù)處理每個點最多能往西邊走多少步num = 0;for(int j = m; j >= 1; j--){if(a[i][j] != '#'){b[i][j][2] = num; num++;}else{num = 0;}}}//把字母方向轉(zhuǎn)換成數(shù)字表示 cin >> k;char key;for(int i = 0;i < k; i++){cin >> key >> t[i].len;if(key == 'N') t[i].dir = 0;else if(key == 'S') t[i].dir = 1;else if(key == 'E') t[i].dir = 2;else if(key == 'W') t[i].dir = 3;}//對每個子母點進(jìn)行模擬 bool flag = false;for(it = l.begin();it != l.end(); it++){node q = *it;if(can(q)){cout << q.g;flag = true;}}if(!flag) cout << "no solution";cout << endl;return 0; }

總結(jié)

以上是生活随笔為你收集整理的51nod 1572 宝岛地图 (预处理四个方向的最大步数优化时间,时间复杂度O(n*m+k))的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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