Человек живет в северо-западном углу (0, 0)города с ростом hи шириной w. Каждый день он идет от своего дома до границы (?, w)или (h, ?). В следующем примере мужчина идет (3, 3)сегодня.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
Человек записывает немного в каждой точке ( +в примере выше). Каждый раз, когда он достигает точки, он идет на восток, если бит немного, 1и на юг в противном случае. Бит переворачивается после того, как он уходит. Например:
Day 1: 1--0 1 1 Day 2: 0 1 1 1 Day 3: 1--1--1--1-- Day 4: 0 0 0 0
| | |
0 1--0 0 0 0 1 0 1 0 1 0 1--0 1 0
| | |
1 0 1--0 1--0 0 1 0 1 0 1 0 1--0 1
| | |
Destination: (3, 3) Destination: (3, 1) Destination: (0, 4) Destination: (3, 2)
Учитывая размер города и историю человека, рассчитайте пункт назначения человека через nнесколько дней.
Входные данные:
В первой строке три целых числа h, wи n.
В следующих hстроках указаны wцелые числа, обозначающие мужскую запись.
h <= 1000, w <= 1000, n <= 1000000000
Выход:
Два целых числа, обозначающие пункт назначения человека после nнескольких дней.
Пример ввода:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Пример вывода:
0 4
Образец кода:
#include <iostream>
using namespace std;
bool d[1000][1000];
int main(){
int h, w, n;
cin >> h >> w >> n;
for(int i = 0; i < h; i++)
for(int j = 0; j < w; j++)
cin >> d[i][j];
int i, j;
while(n--)
for(i = 0, j = 0; i < h && j < w;){
bool &b = d[i][j];
d[i][j] ? j++ : i++;
b = !b;
}
cout << i << " " << j << endl;
}
Подсчет очков:
- Самый низкий счет байтов в UTF-8 побед.
- Если время выполнения вашего кода не зависит от
n, уменьшите ваш счет на 50%.- Не просто рассчитывайте результаты всех 1000000000 дней или делайте глупости, чтобы получить этот бонус. Найдите эффективный алгоритм!
n, мой код вычисляет результаты всех 1000000000 дней, а затем выводит результат n, получу ли я бонус -50%?