div1 250pt:
题意:有个机器人,从某一点出发,他只有碰到地形边缘或者碰到走过的点时才会改变运动方向,然后接着走,现在给出他的运动轨迹,判断他的运动是否合法,如果合法的话,那么整个地形的最小面积是多少。
解法:先随便设定一个起点,然后模拟机器人走的路线,先确定出来运动的大致范围,然后判断运动轨迹是否合法,也就是出了最后一步可以手动终止之外,看其他的时候,它转变方向是不是合法。。。。
1 // BEGIN CUT HERE 2 3 // END CUT HERE 4 #line 5 "RotatingBot.cpp" 5 #include<cstdio> 6 #include<sstream> 7 #include<cstring> 8 #include<cstdlib> 9 #include<ctime> 10 #include<cmath> 11 #include<cassert> 12 #include<iostream> 13 #include<string> 14 #include<vector> 15 #include<map> 16 #include<set> 17 #include<queue> 18 #include<stack> 19 #include<algorithm> 20 using namespace std; 21 typedef long long ll; 22 typedef pair<int,int> pii; 23 int vis[1000][1000]; 24 int dir[4][2] = {1,0,0,1,-1,0,0,-1}; 25 class RotatingBot 26 { 27 public: 28 int minArea(vector <int> moves){ 29 //$CARETPOSITION$ 30 memset(vis,-1,sizeof(vis)); 31 int cur_d = 0; 32 int cur_x = 500,cur_y = 500; 33 vis[cur_x][cur_y] = 0; 34 for(int i = 0;i < moves.size();i++){ 35 int len = moves[i]; 36 while(len > 0){ 37 cur_x += dir[cur_d][0]; 38 cur_y += dir[cur_d][1]; 39 if(vis[cur_x][cur_y] != -1)return -1; 40 vis[cur_x][cur_y] = i; 41 len --; 42 } 43 cur_d = (cur_d + 1) % 4; 44 } 45 // cout << "done" <<endl; 46 int left = 999,right = 0,top = 0,bottom = 999; 47 for(int i = 0;i < 1000;i++) 48 for(int j = 0;j < 1000;j++){ 49 if(vis[i][j] != -1){ 50 left = min(left,i); 51 right = max(right,i); 52 top = max(top,j); 53 bottom = min(bottom,j); 54 } 55 } 56 // cout <<"left: "<<left<<" right: "<<right <<" top: "<<top<<" bottom:"<<bottom<<endl; 57 cur_x = 500,cur_y = 500;cur_d = 0; 58 for(int i = 0;i < moves.size();i++){ 59 int len = moves[i]; 60 while(len > 0){ 61 cur_x += dir[cur_d][0]; 62 cur_y += dir[cur_d][1]; 63 len --; 64 } 65 if(i == moves.size() - 1)continue; 66 int next_x = cur_x + dir[cur_d][0]; 67 int next_y = cur_y + dir[cur_d][1]; 68 if(next_x >= left && next_x <= right && next_y >= bottom && next_y <= top){ 69 if(vis[next_x][next_y] == -1)return -1; 70 if(vis[next_x][next_y] > i)return -1; 71 } 72 cur_d = (cur_d + 1) % 4; 73 } 74 return (right - left + 1) * (top - bottom + 1); 75 76 } 77 78 // BEGIN CUT HERE 79 public: 80 void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); if ((Case == -1) || (Case == 4)) test_case_4(); if ((Case == -1) || (Case == 5)) test_case_5(); if ((Case == -1) || (Case == 6)) test_case_6(); if ((Case == -1) || (Case == 7)) test_case_7(); } 81 private: 82 template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); } 83 void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } } 84 void test_case_0() { int Arr0[] = {15}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 16; verify_case(0, Arg1, minArea(Arg0)); } 85 void test_case_1() { int Arr0[] = {3,10}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 44; verify_case(1, Arg1, minArea(Arg0)); } 86 void test_case_2() { int Arr0[] = {1,1,1,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = -1; verify_case(2, Arg1, minArea(Arg0)); } 87 void test_case_3() { int Arr0[] = {9,5,11,10,11,4,10}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 132; verify_case(3, Arg1, minArea(Arg0)); } 88 void test_case_4() { int Arr0[] = {12,1,27,14,27,12,26,11,25,10,24,9,23,8,22,7,21,6,20,5,19,4,18,3,17,2,16,1,15}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 420; verify_case(4, Arg1, minArea(Arg0)); } 89 void test_case_5() { int Arr0[] = {8,6,6,1}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = -1; verify_case(5, Arg1, minArea(Arg0)); } 90 void test_case_6() { int Arr0[] = {8,6,6}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 63; verify_case(6, Arg1, minArea(Arg0)); } 91 void test_case_7() { int Arr0[] = {5,4,5,3,3}; vector <int> Arg0(Arr0, Arr0 + (sizeof(Arr0) / sizeof(Arr0[0]))); int Arg1 = 30; verify_case(7, Arg1, minArea(Arg0)); } 92 93 // END CUT HERE 94 95 }; 96 // BEGIN CUT HERE 97 int main(){ 98 RotatingBot ___test; 99 ___test.run_test(-1); 100 return 0; 101 } 102 // END CUT HERE