AOJ0037
問題:Path on a Grid
グリッド上の壁情報を与えられ,初期位置から右手づたいに進んでいき,初期位置まで帰ってくるまでの移動方向を出力する問題.
壁情報を配列で扱いやすいよう整理し,それをたどればOK.
自分はサンプル入力の
1111
00001
0110
01011
0010
01111
0010
01001
0111
これを
00000000000
01111111110
00000000010
00011111010
00010001010
00010111010
00010101010
00010111010
00010000010
00011111110
00000000000
のようにして配列に格納しています.
#include<iostream> #include<string> #include<vector> using namespace std; static const int X = 11; static const int Y = 11; static const int DIR = 4; static const string dirchar= "RDLU"; static const int dirx[DIR] = {1,0,-1,0}; static const int diry[DIR] = {0,1,0,-1}; int main() { int field[X][Y] = {0}; string s; int x,y; y=0; while( getline(cin,s) ) { for(x=0;x<s.size();++x) { field[x*2+1][y+1] = s[x]-'0'; } y++; } //横情報を右に引き延ばし for(y=1;y<Y;y+=2) { for(x=1;x<X;x+=2) { if(field[x][y]) { field[x+1][y] = 1; } } } //縦情報を上下に引き延ばし for(y=2;y<Y;y+=2) { for(x=1;x<X;x+=2) { if(field[x][y]) { field[x][y+1] = 1; field[x][y-1] = 1; } } } //field上の1をたどっていく vector<int> ans; x=y=1; int dir=0; while(true) { for(int i=0; i<DIR; ++i) { const int tdir = (dir+DIR-1+i)%DIR; if( field[x + dirx[tdir]][y + diry[tdir]] ) { //fieldを2倍に引き延ばしてるので2マスずつ移動 x += dirx[tdir]*2; y += diry[tdir]*2; ans.push_back(tdir); dir = tdir; break; } } if( x==1 && y==1 )break; } //解答出力 for(int i=0;i<ans.size();++i) { cout << dirchar[ans[i]]; }cout << endl; return 0; }