Artifact Content
Not logged in

Artifact 9e9e901ef52d9c725aaf84413406474c759c76a1


#include <iostream>
#include <sstream>
#include <iomanip>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <numeric>
#include <iterator>
#include <functional>
#include <complex>
#include <queue>
#include <stack>
#include <cmath>
#include <cassert>
#include <tuple>
using namespace std;
typedef long long LL;
typedef complex<double> CMP;

class TwoDimensionalSort { public:
	vector <int> sortLetters(vector <string> board)
	{
		vector<int> ans;
		int next_x = 0;
		for (int y = 0; y < 26; ++y) {
			int np = 26 - count(board[y].begin(), board[y].end(), '.');
			// shift to [next_x .. next_x+np)
			for (;;) {
				int done = 0;
				for (int x = 0, i = 0; x < 26; ++x) {
					if (board[y][x] != '.') {
						int xx = next_x + i;
						if (xx == x)
							done++;
						else if(board[y][xx]=='.'){
							int l = min(x, xx) + 1;
							int r = max(x, xx);
							if (count(board[y].begin() + l, board[y].begin() + r, '.') == r - l) {
								ans.push_back(y);
								ans.push_back(x);
								ans.push_back(y);
								ans.push_back(xx);
								board[y][xx] = board[y][x];
								board[y][x] = '.';
								break;
							}
						}
						++i;
					}
				}
				if (done == np)
					break;
			}
			next_x += np;
		}

		for (int y = 0; y < 26; ++y) {
			for (int x = 0; x < 26; ++x) {
				if (board[y][x] != '.') {
					int yy = board[y][x] - 'A';
					if (y != yy) {
						ans.push_back(y);
						ans.push_back(x);
						ans.push_back(yy);
						ans.push_back(x);
					}
				}
			}
		}
		cerr << ans.size() / 4 << endl;
		return ans;
	}
};

// BEGIN CUT HERE
#include <ctime>
double start_time; string timer()
 { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); }
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v)
 { os << "{ ";
   for(typename vector<T>::const_iterator it=v.begin(); it!=v.end(); ++it)
   os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; }
void verify_case(const vector <int>& Expected, const vector <int>& Received) {
 bool ok = (Expected == Received);
 if(ok) cerr << "PASSED" << timer() << endl;  else { cerr << "FAILED" << timer() << endl;
 cerr << "\to: " << Expected << endl << "\tx: " << Received << endl; } }
#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock();
#define END	 verify_case(_, TwoDimensionalSort().sortLetters(board));}
int main(){

CASE(0)
	string board_[] = {"..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 ".........................."};
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	vector <int> _; 
END
CASE(1)
	string board_[] = {"..........................",
 "..........................",
 "......B...................",
 "..............Q...........",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 ".........................."};
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	int __[] = {3, 14, 3, 17 };
	  vector <int> _(__, __+sizeof(__)/sizeof(*__)); 
END
CASE(2)
	string board_[] = {"..........................",
 "..........................",
 "..........................",
 ".....BCDE.................",
 ".....F....................",
 ".....G.A..................",
 ".....H....................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 ".........................."};
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	int __[] = {5, 7, 5, 9, 5, 9, 2, 9 };
	  vector <int> _(__, __+sizeof(__)/sizeof(*__)); 
END
CASE(3)
	string board_[] = {"..........................",
 "..........................",
 "..........................",
 ".....BCED.................",
 ".....F....................",
 ".....G.A..................",
 ".....H....................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 "..........................",
 ".........................."};
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	int __[] = {3, 7, 2, 7, 2, 7, 2, 11, 5, 7, 0, 7, 2, 11, 3, 11 };
	  vector <int> _(__, __+sizeof(__)/sizeof(*__)); 
	  END
		  CASE(4)
		  string board_[] = {
				  "..........................",
				  "..........................",
				  "..........................",
				  "..........................",
				  "..............P...........",
				  "..............Q...........",
				  "..............N...........",
				  "..............X...........",
				  "..............E...........",
				  "..............H...........",
				  "..............L...........",
				  "..............O...........",
				  "..............J...........",
				  "..............B...........",
				  "..............Y...........",
				  "..............A...........",
				  "..............T...........",
				  "..............I...........",
				  "..............D...........",
				  "..............G...........",
				  "..............U...........",
				  "..............S...........",
				  "..............K...........",
				  "..............C...........",
				  "..........................",
				  ".........................." };
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	  int __[] = { -1 };
	  vector <int> _(__, __+sizeof(__)/sizeof(*__)); 
END
/*
CASE(5)
	string board_[] = ;
	  vector <string> board(board_, board_+sizeof(board_)/sizeof(*board_)); 
	int __[] = ;
	  vector <int> _(__, __+sizeof(__)/sizeof(*__)); 
END
*/
}
// END CUT HERE