Um homem vive no canto noroeste (0, 0)
de uma cidade com altura h
e largura w
. Todos os dias ele sai de sua casa até a fronteira (?, w)
ou (h, ?)
. No exemplo a seguir, o homem vai para (3, 3)
hoje.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
O homem registra um pouco em cada ponto ( +
no exemplo acima). Toda vez que ele chega a um ponto, ele vai para o leste se a parte estiver 1
e para o sul, caso contrário. O bit é invertido depois que ele sai. Por exemplo:
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)
Dado o tamanho da cidade e o histórico do homem, calcule o destino do homem depois de n
dias.
Entrada:
Na primeira linha são três inteiros, h
, w
e n
.
Nas h
linhas a seguir estão w
números inteiros, denotando o registro do homem.
h <= 1000, w <= 1000, n <= 1000000000
Resultado:
Dois inteiros, indicando o destino do homem depois de n
dias.
Entrada de amostra:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Saída de amostra:
0 4
Código de amostra:
#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;
}
Pontuação:
- Menor contagem de bytes em vitórias UTF-8.
- Se o tempo de execução do seu código for independente
n
, reduza sua pontuação em 50%.- Não basta calcular os resultados de todos os 1000000000 dias ou fazer qualquer coisa estúpida para obter esse bônus. Encontre um algoritmo eficiente!
n
seja, meu código calcula os resultados de todos os 1000000000 dias e depois gera o resultado de n
, ainda recebo o bônus de -50%?