Advertisement
Guest User

Untitled

a guest
Oct 6th, 2016
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 KB | None | 0 0
  1. ---
  2. title: NEU1682 全球变暖(bfs+dfs)
  3. layout: post
  4. permalink: /archives/311
  5. categories:
  6. - 算法
  7. tags:
  8. - BFS
  9. - DFS
  10. ---
  11.  
  12. [题目链接](http://acm.neu.edu.cn/hustoj/problem.php?id=1682)
  13.  
  14. 中文题。有两种方法:
  15.  
  16. 第一种:枚举所有海洋的点,bfs搜索,标记陆地的点是第几天被淹没,然后DFS连通分量。
  17.  
  18. ```cpp
  19. #include<iostream>
  20. #include<cmath>
  21. #include<queue>
  22. #include<cstring>
  23. #include<string>
  24. #include<map>
  25. #include<stack>
  26. #include<set>
  27. #include<cstdio>
  28. #include<algorithm>
  29. using namespace std;
  30. int n, m, t;
  31. int pic[2005][2005];
  32. int vis[2005][2005];
  33. int dir[4][2] = {0,1,0,-1,1,0,-1,0};
  34. bool judge(int x, int y){
  35. if(x>=0 && x<n && y>=0 && y<m)
  36. return true;
  37. else return false;
  38. }
  39. void dfs(int x, int y, int cnt){
  40. if(!judge(x, y) || vis[x][y] || !pic[x][y]) return;
  41. vis[x][y] = 1;
  42. for(int i = 0; i < 4; i++){
  43. int x1 = x+dir[i][0];
  44. int y1 = y+dir[i][1];
  45. dfs(x1, y1, cnt);
  46. }
  47. }
  48. int main(){
  49. //freopen("a.txt", "r", stdin);
  50. while(scanf("%d %d %d", &n, &m, &t) != EOF){
  51. queue<int> q;
  52. for(int i = 0; i < n; i++){
  53. char ch[2005];
  54. scanf("%s", ch);
  55. for(int j = 0; j < m; j++){
  56. if(ch[j] == '#')
  57. pic[i][j] = -1;
  58. else{
  59. q.push(i*m+j);
  60. pic[i][j] = 0;
  61. }
  62. }
  63. }
  64. for(int i = 0; i < n; i++){
  65. if(pic[i][0] == -1){
  66. pic[i][0] = 1;
  67. q.push(i*m);
  68. }
  69. if(pic[i][m-1] == -1){
  70. pic[i][m-1] = 1;
  71. q.push(i*m+m-1);
  72. }
  73. }
  74. for(int i = 0; i < m; i++){
  75. if(pic[0][i] == -1){
  76. pic[0][i] = 1;
  77. q.push(i);
  78. }
  79. if(pic[n-1][i] == -1){
  80. pic[n-1][i] = 1;
  81. q.push(m*(n-1)+i);
  82. }
  83. }
  84. while(!q.empty()){
  85. int f = q.front();
  86. q.pop();
  87. int x = f/m; int y = f%m;
  88. for(int i = 0; i < 4; i++){
  89. int x1 = x+dir[i][0];
  90. int y1 = y+dir[i][1];
  91. if(judge(x1, y1) && pic[x1][y1] == -1){
  92. pic[x1][y1] = pic[x][y]+1;
  93. q.push(x1*m+y1);
  94. }
  95. }
  96. }
  97. for(int i = 0; i < n; i++)
  98. for(int j = 0; j < m; j++)
  99. if(pic[i][j] <= t)
  100. pic[i][j] = 0;
  101. memset(vis, 0, sizeof(vis));
  102. int num = 0;
  103. for(int i = 0; i < n; i++)
  104. for(int j = 0; j < m; j++)
  105. if(pic[i][j] && !vis[i][j])
  106. dfs(i, j, ++num);
  107. cout << num <<endl;
  108. for(int i = 0; i < n; i++){
  109. for(int j = 0; j < m; j++){
  110. if(!pic[i][j])
  111. cout << ".";
  112. else cout << "#";
  113. }
  114. cout << endl;
  115. }
  116.  
  117. }
  118. return 0;
  119. }
  120. ```
  121.  
  122. 用queue写bfs的话1.7s过的,如果用数组搞bfs只有0.7s,差距非常感人。
  123.  
  124. 第二种方法:在搜索连通分量之前,并不需要bfs,正反各遍历一遍图,就可以标记完成。
  125.  
  126. ```cpp
  127. #include <cstdio>
  128. #include <cstring>
  129. #include <cmath>
  130. #include <algorithm>
  131. #include <iostream>
  132. #include <queue>
  133. using namespace std;
  134. int dis[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
  135. char mp[2010][2010];
  136. int TM[2010][2010];
  137. bool vis[2010][2010];
  138. int m,n,t;
  139. struct mm{
  140. int x,y;
  141. };
  142. void bfs(int x,int y){
  143. queue <mm> q;
  144. mm st;
  145. st.x=x;
  146. st.y=y;
  147. vis[x][y]=1;
  148. q.push(st);
  149. while(!q.empty()){
  150. mm now=q.front();
  151. q.pop();
  152. mm next;
  153. for(int i=0;i<4;i++){
  154. next.x=now.x+dis[i][0];
  155. next.y=now.y+dis[i][1];
  156. if(!vis[next.x][next.y]&&TM[next.x][next.y]>t){
  157. vis[next.x][next.y]=1;
  158. q.push(next);
  159. }
  160. }
  161. }
  162. }
  163. int main()
  164. {
  165. //freopen("in.txt","r",stdin);
  166. while(scanf("%d%d%d",&n,&m,&t)!=EOF){
  167. memset(vis,0,sizeof(vis));
  168. memset(TM,0,sizeof(TM));
  169. for(int i=0;i<n;i++){
  170. scanf("%s",mp[i]);
  171. }
  172. for(int j=0;j<m;j++){
  173. if(mp[0][j]=='.'){
  174. TM[0][j]=0;
  175. }
  176. else{
  177. TM[0][j]=1;
  178. }
  179. mp[0][j]='.';
  180. if(mp[n-1][j]=='.'){
  181. TM[n-1][j]=0;
  182. }
  183. else{
  184. TM[n-1][j]=1;
  185. }
  186. mp[n-1][j]='.';
  187. }
  188. for(int i=1;i<n-1;i++){
  189. if(mp[i][0]=='.'){
  190. TM[i][0]=0;
  191. }
  192. else{
  193. TM[i][0]=1;
  194. }
  195. mp[i][0]='.';
  196. if(mp[i][m-1]=='.'){
  197. TM[i][m-1]=0;
  198. }
  199. else{
  200. TM[i][m-1]=1;
  201. }
  202. mp[i][m-1]='.';
  203. }
  204. for(int i=1;i<n-1;i++){
  205. for(int j=1;j<m-1;j++){
  206. if(mp[i][j]=='.'){
  207. TM[i][j]=0;
  208. }
  209. else{
  210. int k=1000000;
  211. k=min(k,TM[i-1][j]+1);
  212. //k=min(k,TM[i+1][j]+1);
  213. k=min(k,TM[i][j-1]+1);
  214. //k=min(k,TM[i][j+1]+1);
  215. TM[i][j]=k;
  216. //printf("%d %d %dn",i,j,k);
  217. }
  218. }
  219. }
  220. /*for(int i=0;i<n;i++){
  221. for(int j=0;j<m;j++){
  222. printf("%d",TM[i][j]);
  223. }
  224. printf("n");
  225. }*/
  226. for(int i=n-2;i>0;i--){
  227. for(int j=m-2;j>0;j--){
  228. if(mp[i][j]=='.'){
  229. TM[i][j]=0;
  230. }
  231. else{
  232. int k=1000000;
  233. k=min(k,TM[i-1][j]+1);
  234. k=min(k,TM[i+1][j]+1);
  235. k=min(k,TM[i][j-1]+1);
  236. k=min(k,TM[i][j+1]+1);
  237. TM[i][j]=k;
  238. }
  239. }
  240. }
  241. int ans=0;
  242. for(int i=1;i<n-1;i++){
  243. for(int j=1;j<m-1;j++){
  244. if(!vis[i][j]&&mp[i][j]=='#'&&TM[i][j]>t){
  245. ans++;
  246. bfs(i,j);
  247. }
  248. }
  249. }
  250. /*for(int i=0;i<n;i++){
  251. for(int j=0;j<m;j++){
  252. printf("%d",TM[i][j]);
  253. }
  254. printf("n");
  255. }*/
  256. printf("%dn",ans);
  257. for(int i=0;i<n;i++){
  258. for(int j=0;j<m;j++){
  259. if(TM[i][j]<=t){
  260. printf(".");
  261. }
  262. else{
  263. printf("#");
  264. }
  265. }
  266. printf("n");
  267. }
  268. }
  269. return 0;
  270. }
  271. ```
  272.  
  273. 第二种方法只有0.5s
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement