///MEMENTO MEMO, MEMENTO LONG LONG
#include <bits/stdc++.h>
#define DEBUG if(1)
#define COUT cout << "\e[36m"
#define ENDL "\e[39m" << endl
#define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] "
using namespace std;
typedef long long LL;
int n, m, q;
int bound[2];
const int MAXPATT = 8;
array<vector<array<vector<bool>, MAXPATT+1>>, 2> can_go;
//pattern[side][pos][ptt_len][time]
void parse_pattern(string pattern, int x, int y)
{
for (int i = 0; i < pattern.size(); ++i)
{
int light = pattern[i] - '0';
can_go[(light)%2][(light) ? y : x][pattern.size()][i] = true;
}
}
void patterns_prep()
{
for (int i = 0; i < 2; ++i)
{
can_go[i].resize(bound[i]);
for(auto& arr : can_go[i])
{
for (int j = 0; j < arr.size(); ++j)
{
arr[j].resize(j, false);
}
}
}
}
int wait_time(int bck, int side, int pos, const int s_time)
{
int time = s_time;
while(true)
{
for (int ptt_len = 2; ptt_len <= MAXPATT; ++ptt_len)
{
if(can_go[side][pos - bck][ptt_len][time%ptt_len])
{
return time-s_time;
}
}
time++;
}
}
void process_query()
{
int s_time;
cin >> s_time;
int s_x, s_y;
int e_x, e_y;
cin >> s_x >> s_y >> e_x >> e_y;
int bck = ((s_x > e_x)? 1: 0);
int time = s_time;
int x = s_x, y = s_y;
bool hit = false;
while (x != e_x)
{
int wait = wait_time(bck, 0, x, time);
time += wait;
if(wait)
{
hit = true;
}
x += ((bck)? -1 : 1);
}
if(hit)
{
cout << time << "\n";
return;
}
bck = ((s_y > e_y)? 1: 0);
while(y != e_y)
{
int wait = wait_time(bck, 1, y, time);
time += wait;
y += ((bck)? -1 : 1);
}
cout << time << "\n";
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> q;
bound[0] = n;
bound[1] = m;
patterns_prep();
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < m; ++j)
{
string pattern;
cin >> pattern;
parse_pattern(pattern, i, j);
}
}
for (int qi = 0; qi < q; ++qi)
{
process_query();
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | ///MEMENTO MEMO, MEMENTO LONG LONG #include <bits/stdc++.h> #define DEBUG if(1) #define COUT cout << "\e[36m" #define ENDL "\e[39m" << endl #define VAR(v) " [\e[32m" << #v << "\e[36m=\e[91m" << v << "\e[36m] " using namespace std; typedef long long LL; int n, m, q; int bound[2]; const int MAXPATT = 8; array<vector<array<vector<bool>, MAXPATT+1>>, 2> can_go; //pattern[side][pos][ptt_len][time] void parse_pattern(string pattern, int x, int y) { for (int i = 0; i < pattern.size(); ++i) { int light = pattern[i] - '0'; can_go[(light)%2][(light) ? y : x][pattern.size()][i] = true; } } void patterns_prep() { for (int i = 0; i < 2; ++i) { can_go[i].resize(bound[i]); for(auto& arr : can_go[i]) { for (int j = 0; j < arr.size(); ++j) { arr[j].resize(j, false); } } } } int wait_time(int bck, int side, int pos, const int s_time) { int time = s_time; while(true) { for (int ptt_len = 2; ptt_len <= MAXPATT; ++ptt_len) { if(can_go[side][pos - bck][ptt_len][time%ptt_len]) { return time-s_time; } } time++; } } void process_query() { int s_time; cin >> s_time; int s_x, s_y; int e_x, e_y; cin >> s_x >> s_y >> e_x >> e_y; int bck = ((s_x > e_x)? 1: 0); int time = s_time; int x = s_x, y = s_y; bool hit = false; while (x != e_x) { int wait = wait_time(bck, 0, x, time); time += wait; if(wait) { hit = true; } x += ((bck)? -1 : 1); } if(hit) { cout << time << "\n"; return; } bck = ((s_y > e_y)? 1: 0); while(y != e_y) { int wait = wait_time(bck, 1, y, time); time += wait; y += ((bck)? -1 : 1); } cout << time << "\n"; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m >> q; bound[0] = n; bound[1] = m; patterns_prep(); for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { string pattern; cin >> pattern; parse_pattern(pattern, i, j); } } for (int qi = 0; qi < q; ++qi) { process_query(); } } |
English