解法
誤読していた。向きを変えるので1秒、動こうとするので1秒とかやって訳の分からないことをしていた。
向きを変えるステップは自明なので簡単だが、移動するステップが面倒。
最初人視点でやっていたので詰んでしまったが、マス視点でやってあとは頑張った。
dxとかdyとかdmとか4次元配列になってるけど、これはただ求める計算式に至らなかっただけ。
良い感じにシュミレーションすれば勝てる。
ソース
#include<iostream> #include<vector> #include<map> #include<string> using namespace std; typedef pair < int , int > Pi; typedef pair < int , Pi > Pii; #define fr first #define sc second const int dy[][4] = {{1,0,-1,0},{0,-1,0,1},{-1,0,1,0},{0,1,0,-1}}; const int dx[][4] = {{0,1,0,-1},{1,0,-1,0},{0,-1,0,1},{-1,0,1,0}}; const int dm[][4] = {{3,0,1,2},{0,1,2,3},{1,2,3,0},{2,3,0,1}}; const int my[] = { 0, -1, 0, 1}, mx[] = { 1, 0, -1, 0}; const int md[] = { 2, 3, 0, 1}; int w, h; char mas[30][30]; vector< Pii > vc; string tmp = "ENWS"; int search( int y , int x){ for(int i = 0 ; i < vc.size() ; i++ ){ if(Pi(y,x) == vc[i].sc){ return i; } } return -1; } vector< Pii > solve(){ vector< Pii > java; for(int i = 0 ; i < vc.size() ; i++ ){ //change for(int j = 0 ; j < 4 ; j++ ){ int yy = vc[i].sc.fr + dy[vc[i].fr][j]; int xx = vc[i].sc.sc + dx[vc[i].fr][j]; if(mas[yy][xx] != '#' && search(yy,xx) == -1){ vc[i].fr = dm[vc[i].fr][j]; break; } } } //push bool list[1000] = {}; for(int i = 0 ; i < h ; i++ ){ for(int j = 0 ; j < w ; j++ ){ if(mas[i][j] == '#' || search(i,j) != -1) continue; for(int k = 0 ; k < 4 ; k++ ){ int ny = i + my[k], nx = j + mx[k], iti; if((iti = search(ny,nx)) == -1) continue; if(vc[iti].fr == md[k]){ if(mas[i][j] != 'X') java.push_back(Pii(vc[iti].fr,Pi(i,j))); list[iti] = true; break; } } } } for(int i = 0 ; i < vc.size() ; i++ ){ if(!list[i]) java.push_back(vc[i]); } return java; } int main(){ while(cin >> w >> h , w){ for(int i = 0 ; i < h ; i++ ){ for(int j = 0 ; j < w ; j++ ){ cin >> mas[i][j]; if(tmp.find(mas[i][j]) != string::npos){ vc.push_back(Pii( tmp.find(mas[i][j]), Pi( i, j))); } } } int ret = 0; while(ret <= 180 && !vc.empty()){ vc = solve(); ret++; } if(ret == 181) cout << "NA" << endl; else cout << ret << endl; vc.clear(); } }
0 件のコメント:
コメントを投稿