File Annotation
Not logged in
76db68d634 2018-07-28        kinaba: #include <iostream>
76db68d634 2018-07-28        kinaba: #include <sstream>
76db68d634 2018-07-28        kinaba: #include <iomanip>
76db68d634 2018-07-28        kinaba: #include <vector>
76db68d634 2018-07-28        kinaba: #include <string>
76db68d634 2018-07-28        kinaba: #include <map>
76db68d634 2018-07-28        kinaba: #include <set>
76db68d634 2018-07-28        kinaba: #include <algorithm>
76db68d634 2018-07-28        kinaba: #include <numeric>
76db68d634 2018-07-28        kinaba: #include <iterator>
76db68d634 2018-07-28        kinaba: #include <functional>
76db68d634 2018-07-28        kinaba: #include <complex>
76db68d634 2018-07-28        kinaba: #include <queue>
76db68d634 2018-07-28        kinaba: #include <stack>
76db68d634 2018-07-28        kinaba: #include <cmath>
76db68d634 2018-07-28        kinaba: #include <cassert>
76db68d634 2018-07-28        kinaba: #include <tuple>
76db68d634 2018-07-28        kinaba: using namespace std;
76db68d634 2018-07-28        kinaba: typedef long long LL;
76db68d634 2018-07-28        kinaba: typedef complex<double> CMP;
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: class SquareCutout { public:
76db68d634 2018-07-28        kinaba: 	int verify(vector <string> cutout)
76db68d634 2018-07-28        kinaba: 	{
76db68d634 2018-07-28        kinaba: 		const int Y = cutout.size(), X = cutout[0].size();
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: 		bool has_black = false;
76db68d634 2018-07-28        kinaba: 		for (int y = 0; y < Y; ++y)
76db68d634 2018-07-28        kinaba: 			for (int x = 0; x < X; ++x)
76db68d634 2018-07-28        kinaba: 				if (cutout[y][x] == '#')
76db68d634 2018-07-28        kinaba: 					has_black = true;
76db68d634 2018-07-28        kinaba: 		if (!has_black)
76db68d634 2018-07-28        kinaba: 			return 1;
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: 		int ym = Y, xm = X, yM = 0, xM = 0;
76db68d634 2018-07-28        kinaba: 		for (int y = 0; y < Y; ++y)
76db68d634 2018-07-28        kinaba: 			for (int x = 0; x < X; ++x)
76db68d634 2018-07-28        kinaba: 				if (cutout[y][x] == '#')
76db68d634 2018-07-28        kinaba: 					ym = min(ym, y), yM = max(yM, y), xm = min(xm, x), xM = max(xM, x);
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: 		for (int y = ym; y <= yM; ++y)
76db68d634 2018-07-28        kinaba: 			for (int x = xm; x <= xM; ++x)
76db68d634 2018-07-28        kinaba: 				if (cutout[y][x] != '#')
76db68d634 2018-07-28        kinaba: 					return 0;
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: 		bool x_extendable = (xm == 0 || xM == X - 1);
76db68d634 2018-07-28        kinaba: 		bool y_extendable = (ym == 0 || yM == Y - 1);
76db68d634 2018-07-28        kinaba: 		int yy = yM - ym + 1;
76db68d634 2018-07-28        kinaba: 		int xx = xM - xm + 1;
76db68d634 2018-07-28        kinaba: 		if (yy == xx)
76db68d634 2018-07-28        kinaba: 			return yy;
76db68d634 2018-07-28        kinaba: 		if (yy < xx)
76db68d634 2018-07-28        kinaba: 			return y_extendable ? xx : 0;
76db68d634 2018-07-28        kinaba: 		return x_extendable ? yy : 0;
76db68d634 2018-07-28        kinaba: 	}
76db68d634 2018-07-28        kinaba: };
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: // BEGIN CUT HERE
76db68d634 2018-07-28        kinaba: #include <ctime>
76db68d634 2018-07-28        kinaba: double start_time; string timer()
76db68d634 2018-07-28        kinaba:  { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); }
76db68d634 2018-07-28        kinaba: template<typename T> ostream& operator<<(ostream& os, const vector<T>& v)
76db68d634 2018-07-28        kinaba:  { os << "{ ";
76db68d634 2018-07-28        kinaba:    for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it)
76db68d634 2018-07-28        kinaba:    os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; }
76db68d634 2018-07-28        kinaba: void verify_case(const int& Expected, const int& Received) {
76db68d634 2018-07-28        kinaba:  bool ok = (Expected == Received);
76db68d634 2018-07-28        kinaba:  if(ok) cerr << "PASSED" << timer() << endl;  else { cerr << "FAILED" << timer() << endl;
76db68d634 2018-07-28        kinaba:  cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } }
76db68d634 2018-07-28        kinaba: #define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock();
76db68d634 2018-07-28        kinaba: #define END	 verify_case(_, SquareCutout().verify(cutout));}
76db68d634 2018-07-28        kinaba: int main(){
76db68d634 2018-07-28        kinaba: 
76db68d634 2018-07-28        kinaba: CASE(0)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = {".....",
76db68d634 2018-07-28        kinaba:  "..##.",
76db68d634 2018-07-28        kinaba:  "..##.",
76db68d634 2018-07-28        kinaba:  ".....",
76db68d634 2018-07-28        kinaba:  "....."};
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 2;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: CASE(1)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = {"...",
76db68d634 2018-07-28        kinaba:  "..."};
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 1;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: CASE(2)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = {".....",
76db68d634 2018-07-28        kinaba:  ".###.",
76db68d634 2018-07-28        kinaba:  ".#.#.",
76db68d634 2018-07-28        kinaba:  ".###.",
76db68d634 2018-07-28        kinaba:  "....."};
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 0;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: CASE(3)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = {"..####",
76db68d634 2018-07-28        kinaba:  "..####",
76db68d634 2018-07-28        kinaba:  "......"};
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 4;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: CASE(4)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = {"..#..",
76db68d634 2018-07-28        kinaba:  ".###.",
76db68d634 2018-07-28        kinaba:  "#####",
76db68d634 2018-07-28        kinaba:  ".###.",
76db68d634 2018-07-28        kinaba:  "..#.."};
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 0;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: CASE(5)
76db68d634 2018-07-28        kinaba: string cutout_[] = { "...", "...", "..." };
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = 1;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: /*
76db68d634 2018-07-28        kinaba: CASE(6)
76db68d634 2018-07-28        kinaba: 	string cutout_[] = ;
76db68d634 2018-07-28        kinaba: 	  vector <string> cutout(cutout_, cutout_+sizeof(cutout_)/sizeof(*cutout_));
76db68d634 2018-07-28        kinaba: 	int _ = ;
76db68d634 2018-07-28        kinaba: END
76db68d634 2018-07-28        kinaba: */
76db68d634 2018-07-28        kinaba: }
76db68d634 2018-07-28        kinaba: // END CUT HERE