Um homem vive no canto noroeste (0, 0)de uma cidade com altura he 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 1e 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 ndias.
Entrada:
Na primeira linha são três inteiros, h, we n.
Nas hlinhas a seguir estão wnúmeros inteiros, denotando o registro do homem.
h <= 1000, w <= 1000, n <= 1000000000
Resultado:
Dois inteiros, indicando o destino do homem depois de ndias.
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!
nseja, 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%?