SPOJ 206 BITMAP (BFS)

来源:互联网 发布:focusky模板 知乎 编辑:程序博客网 时间:2024/04/26 15:38

http://www.spoj.com/problems/BITMAP/

这题一开始我用n^2遍BFS带剪枝做的,当然TLE,后来只从白点开始BFS,效率稍高,但还是TLE,后来在加了一条如果扩展节点为白色就continue的剪枝,结果竟然WA。原来我是边输入边BFS,有些白点还没有读入就开始搜索了。


AC代码:

#include <cassert>#include <cctype>#include <cerrno>#include <cfloat>#include <ciso646>#include <climits>#include <clocale>#include <cmath>#include <csetjmp>#include <csignal>#include <cstdarg>#include <cstddef>#include <cstdio>#include <cstdlib>#include <cstring>#include <ctime>#include <complex>#include <algorithm>#include <bitset>#include <complex>#include <deque>#include <exception>#include <fstream>#include <functional>#include <iomanip>#include <ios>#include <iosfwd>#include <iostream>#include <istream>#include <iterator>#include <limits>#include <list>#include <locale>#include <map>#include <memory>#include <new>#include <numeric>#include <ostream>#include <queue>#include <set>#include <sstream>#include <stack>#include <stdexcept>#include <streambuf>#include <string>#include <typeinfo>#include <utility>#include <valarray>#include <vector>#define INF 1000000007/*Problem: BitmapSource: SPOJ 206 (BITMAP)Author: fts2001*/using namespace std;typedef pair<int,int> pii;typedef pair<pii,int> ppi;int t,n,m,bm[185][185],d[185][185];const int dx[]={1,-1,0,0};const int dy[]={0,0,1,-1};void bfs(int x,int y){queue<ppi> q;q.push(ppi(pii(x,y),0));d[x][y]=0;while(!q.empty()){int r=q.front().first.first;int c=q.front().first.second;int l=q.front().second;q.pop();for(int i=0;i<4;i++){int nr=r+dx[i],nc=c+dy[i];if(nr<0 || nr>=n || nc<0 || nc>=m)continue;if(bm[nr][nc])continue;if(l+1>=d[nr][nc])continue;d[nr][nc]=l+1;q.push(ppi(pii(nr,nc),l+1));}}}int main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){getchar();for(int j=0;j<m;j++){char ch=getchar();bm[i][j]=ch-'0';d[i][j]=INF;}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(bm[i][j])bfs(i,j);}}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(j)putchar(' ');printf("%d",d[i][j]);}putchar('\n');}}return 0;}


0 0
原创粉丝点击