Submission #1220568

#TimeUsernameProblemLanguageResultExecution timeMemory
1220568siewjhNavigation 2 (JOI21_navigation2)C++20
100 / 100
286 ms928 KiB
#include "Anna.h"
#include <bits/stdc++.h>
using namespace std;

namespace {
	const int MAXN = 101;
	int N, asg[MAXN][MAXN], fr[7], fc[7], use[9];

	bool test(int roff, int coff){
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++){
				int br = (i + 3 - roff) % 3, bc = (j + 3 - coff) % 3, flag = br * 3 + bc;
				if (flag < 7){
					int r = fr[flag], c = fc[flag];
					if (r <= i - 2) asg[i][j] = 11;
					else if (r >= i + 2) asg[i][j] = 12;
					else if (c <= j - 2) asg[i][j] = 9;
					else if (c >= j + 2) asg[i][j] = 10;
					else if (r == i - 1){
						if (c == j - 1) return 0;
						else if (c == j) asg[i][j] = 1;
						else asg[i][j] = 2;
					}
					else if (r == i){
						if (c == j - 1) asg[i][j] = 3;
						else if (c == j) asg[i][j] = 4;
						else asg[i][j] = 5;
					}
					else{
						if (c == j - 1) asg[i][j] = 6;
						else if (c == j) asg[i][j] = 7;
						else asg[i][j] = 8;
					}
					if (asg[i][j] <= 8) use[asg[i][j]] = 1;
				}
			}
		int sk;
		for (int i = 1; i <= 8; i++)
			if (!use[i]){
				sk = i; break;
			}
		for (int i = 0; i < N; i++)
			for (int j = 0; j < N; j++){
				int br = (i + 3 - roff) % 3, bc = (j + 3 - coff) % 3, flag = br * 3 + bc;
				if (flag < 7){
					if (asg[i][j] > sk) asg[i][j]--;
				}
				else if (flag == 7) asg[i][j] = sk;
				else asg[i][j] = 12;
				SetFlag(i, j, asg[i][j]);
			}
		return 1;
	}
}

void Anna(int N, int K, vector<int> R, vector<int> C){
	::N = N;
	for (int i = 0; i < K; i++){
		fr[i] = R[i]; fc[i] = C[i];
	}
	for (int roff = 0; roff < 3; roff++)
		for (int coff = 0; coff < 3; coff++){
			memset(use, 0, sizeof(use));
			if (test(roff, coff)) return;
		}
}
#include "Bruno.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> Bruno(int K, vector<int> value) {
	int id, rid, cid, sid, sr, sc, sk;
	for (int i = 0; i < 9; i++)
		if (value[i] == 12){
			rid = (i / 3 + 1) % 3; cid = (i % 3 + 1) % 3; id = rid * 3 + cid;
			sr = (rid + 2) % 3, sc = (cid + 1) % 3, sid = sr * 3 + sc, sk = value[sid];
			for (int x = 0; x < 9; x++)
				if (x != sid && value[x] >= sk)
					value[x]++;
			break;
		}
	vector<int> ans(K);
	for (int i = 0; i < 9; i++){
		int r = i / 3, c = i % 3;
		int insr = (r + 3 - rid) % 3, insc = (c + 3 - cid) % 3, flag = insr * 3 + insc;
		if (flag < 7){
			if (value[i] == 9) ans[flag] = 1;
			else if (value[i] == 10) ans[flag] = 0;
			else if (value[i] == 11) ans[flag] = 3;
			else if (value[i] == 12) ans[flag] = 2;
			else {
				int flr = r, flc = c;
				if (value[i] == 1) flr--;
				else if (value[i] == 2){
					flr--; flc++;
				}
				else if (value[i] == 3) flc--;
				else if (value[i] == 4);
				else if (value[i] == 5) flc++;
				else if (value[i] == 6){
					flr++; flc--;
				}
				else if (value[i] == 7) flr++;
				else{
					flr++; flc++;
				}
				if (flr < 1) ans[flag] = 3;
				else if (flr > 1) ans[flag] = 2;
				else if (flc < 1) ans[flag] = 1;
				else if (flc > 1) ans[flag] = 0;
				else ans[flag] = 4;
			}
		}
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...