Problem 2253 Brave Force Story ICPC模擬国内予選2011 B
解き方
マップの大きさが-30から30では無いので注意。死亡。
あくまで、スタート位置、障害物が-30から30の間にある。
それさえ分かれば、優先度のあるBFSするだけ。
ソースコード
#include <iostream> #include <set> #include <algorithm> using namespace std; #define FOREACH(t,p,it) for(t::iterator it=p.begin();it!=p.end();++it) #define foreach(t,p) FOREACH(t,p) #define all(p) p.begin(),p.end() #define REP(i,p) for(int i=0;i<p;i++) #define rep(p) REP(i,p) typedef pair<int,int> pos; typedef pair<int,pair<int,int> > pp; const int WH = 1000; bool o[WH][WH]; bool v[WH][WH]; int size; int main() { int t,n; while(cin>>t>>n&&(t||n)) { REP(i,WH) REP(t,WH) o[i][t]=v[i][t]=false; int x,y; REP(i,n){ cin>>x>>y; o[x+WH/2][y+WH/2]=true; } cin>>x>>y; // start set<pp,greater<pp> > states; states.insert( pp(t,pos(x,y)) ); while( !states.empty() ) { pp a = *states.begin(); states.erase(states.begin()); x = (a.second).first; y = (a.second).second; if( o[x+WH/2][y+WH/2] ) continue; if( v[x+WH/2][y+WH/2] ) continue; v[x+WH/2][y+WH/2] = true; if( a.first == 0 ) continue; states.insert( pp(a.first-1,pos(x-1,y)) ); states.insert( pp(a.first-1,pos(x-1,y-1)) ); states.insert( pp(a.first-1,pos(x,y-1)) ); states.insert( pp(a.first-1,pos(x+1,y)) ); states.insert( pp(a.first-1,pos(x+1,y+1)) ); states.insert( pp(a.first-1,pos(x,y+1)) ); } int sum = 0; REP(i,WH) REP(t,WH) sum+=(v[i][t]?1:0); cout << sum << endl; } return 0; }