diff --git a/2048.cpp b/2048.cpp new file mode 100644 index 0000000..87f3211 --- /dev/null +++ b/2048.cpp @@ -0,0 +1,276 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +#pragma region Core Library + +/* clang-format off */ + +/* 1. TYPES */ +#define ll long long +#define pii pair +#define pll pair +#define vi vector +#define vc vector +#define vs vector +#define vll vector +#define vpsi vector> +#define mii map +#define mci map +#define msi map +#define mss map +#define msl map +#define mls map +#define si set +#define sc set +#define ss set +#define sll set + +/* 2. FUNCTIONS */ +#define strl_read(...) string __VA_ARGS__; getline(cin, __VA_ARGS__) +#define dbl_read(...) double __VA_ARGS__; read(__VA_ARGS__) +#define ll_read(...) ll __VA_ARGS__; read(__VA_ARGS__) +#define char_read(...) char __VA_ARGS__; read(__VA_ARGS__) +#define str_read(...) string __VA_ARGS__; read(__VA_ARGS__) +template +bool read(T& first) { + return static_cast(std::cin >> first); +} + +template +bool read(T& first, Args&... args) { + if (!(std::cin >> first)) + return false; + return read(args...); +} + +void read_lines(std::string& line) { + std::getline(std::cin, line); +} +template +void read_lines(std::string& line, Args&... args) { + std::getline(std::cin, line); + read_lines(args...); // recursively read each line +} +#define f(i,s,e) for(long long int i=s;i + constexpr T&& operator()(T&& t) const noexcept { + return std::forward(t); + } +}; +#endif +template +auto argmin(Iterator begin, Iterator end, Func func = {}) { + auto it = std::min_element(begin, end, [&](const auto& a, const auto& b) { + return func(a) < func(b); + }); + return std::distance(begin, it); +} +template +auto argmax(Iterator begin, Iterator end, Func func = {}) { + auto it = std::max_element(begin, end, [&](const auto& a, const auto& b) { + return func(a) < func(b); + }); + return std::distance(begin, it); +} + +#define flr(x) floor(x) // Shortcut for floor +#define cl(x) ceil(x) // Shortcut for ceil + +template +std::set U(const std::set& a, const std::set& b) { + std::set result; + std::set_union(a.begin(), a.end(), b.begin(), b.end(), std::inserter(result, result.begin())); + return result; +} + +template +std::set I(const std::set& a, const std::set& b) { + std::set result; + std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::inserter(result, result.begin())); + return result; +} + +template +std::set D(const std::set& a, const std::set& b) { + std::set result; + std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(result, result.begin())); + return result; +} + +/* 4 CONVERSIONS */ +template +auto toset(const U& v) -> std::set { + return std::set(v.begin(), v.end()); +} + +/* 5 PRINTS */ +// Type trait to check if a type is a container (has begin() and end()) +template struct is_container : std::false_type {}; +template +struct is_container< + T, typename std::enable_if< + !std::is_same::value && // Exclude std::string + !std::is_same::value && // Exclude C-style strings + std::is_same())), + decltype(std::end(std::declval()))>::value>::type> + : std::true_type {}; +// Base case: types that are not containers or strings +template +typename std::enable_if::value && + !std::is_same::value>::type +print(const T& x) {std::cout << x;} +// Overload for strings and C-style strings +void print(const std::string& s) { std::cout << s; } +void print(const char* s) { std::cout << s; } +// Overload for pairs +template void print(const std::pair& p) { std::cout << "(";print(p.first); std::cout << ", "; print(p.second);std::cout << ")";} +// Overload for containers +template +typename std::enable_if::value>::type print(const T& container) { std::cout << "[";bool first = true;for (const auto& element : container) {if (!first) std::cout << ", "; print(element); first = false; } std::cout << "]"; } +template +void print(const T& first, const Args&... args) { print(first); print(args...); } + +/* 6. UTILS */ +#define MOD 1000000007 +#define PI 3.1415926535897932384626433832795 +#define NL "\n" +#define NLL "\n\n" +ll min(ll a,int b) { if (ab) return a; return b; } +ll max(int a,ll b) { if (a>b) return a; return b; } +ll gcd(ll a,ll b) { if (b==0) return a; return gcd(b, a%b); } +ll lcm(ll a,ll b) { return a/gcd(a,b)*b; } +char to_upper(char a) {if (a >= 'a' && a <= 'z') a -= 'a' - 'A';return a;} +char to_lower(char a) { if (a >= 'A' && a <= 'Z') a += 'a' - 'A';return a;} +string to_upper(string a) {for (int i = 0; i < (int)a.size(); ++i) a[i] = to_upper(a[i]); return a;} +string to_lower(string a) {for (int i = 0; i < (int)a.size(); ++i) a[i] = to_lower(a[i]); return a;} +bool prime(ll a) { if (a==1) return 0; for (int i=2;i<=round(sqrt(a));++i) if (a%i==0) return 0; return 1; } +void yes() { cout<<"YES\n"; } +void no() { cout<<"NO\n"; } + +/* 7. All Required define Pre-Processors and typedef Constants */ +typedef long int int32; +typedef unsigned long int uint32; +typedef long long int int64; +typedef unsigned long long int uint64; +typedef string str; + +#pragma endregion + +/* clang-format on */ +#define ONLINE_JUDGE 1 +#define M_SIZE 4 + +void rotateMatrix(long long (*m)[4]){ + int r, c; + + for(r = 0; r < M_SIZE/2; r++){ + for(c = r; c < M_SIZE - r - 1; c++){ + int tmp = m[r][c]; + + m[r][c] = m[M_SIZE - c - 1][r]; + m[M_SIZE - c - 1][r] = m[M_SIZE - r - 1][M_SIZE - c - 1]; + m[M_SIZE - r - 1][M_SIZE - c - 1] = m[c][M_SIZE - r - 1]; + m[c][M_SIZE - r - 1] = tmp; + } + } +} + + +int main(int argc, char* argv[]) { + ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0); +#ifndef ONLINE_JUDGE + freopen("input.txt", "r", stdin); // input.txt + freopen("output.txt", "w", stdout); // output.txt +#endif + ll arr[4][4]; + f(i, 0, 4) { + f(j, 0, 4) { + ll_read(v); + arr[i][j] = v; + } + } + ll_read(next_mv); + + ll min_i = 0; + ll min_j = 0; + ll max_i = 4; + ll max_j = 4; + + f(_, 0, 4-next_mv) rotateMatrix(arr); + + f(i, min_i, max_i) { + f(j, min_j+1, max_j) { + if (j <= 0) j = min_j + 1; + if (arr[i][j-1] == 0 && arr[i][j] != 0) { + arr[i][j-1] = arr[i][j]; + arr[i][j] = 0; + j -= 2; + } + } + } + + + f(i, min_i, max_i) { + f(j, min_j, max_j-1) { + if (arr[i][j] == arr[i][j+1]) { + arr[i][j] *= 2; + f(last, j+1, max_j) { + arr[i][last] = arr[i][last+1]; + } + arr[i][max_j-1] = 0; + } + } + } + + f(_, 0, next_mv) rotateMatrix(arr); + + f(i, 0, max_i){ + f(j, 0, max_j){ + print(arr[i][j], " "); + } + print("\n"); + } + + + + + return 0; +}