Một người đàn ông sống ở góc tây bắc (0, 0)
của một thị trấn có chiều cao h
và chiều rộng w
. Hàng ngày anh đi bộ từ nhà đến biên giới (?, w)
hay (h, ?)
. Trong ví dụ sau, người đàn ông đi đến (3, 3)
ngày hôm nay.
(0, 0) +--+ + + . (0, 4)
|
+ +--+--+ .
|
+ + + + .
|
(3, 0) . . . . . (3, 4)
Người đàn ông ghi lại một chút tại mỗi điểm ( +
ví dụ ở trên). Mỗi khi anh ta đạt đến một điểm, anh ta đi về phía đông nếu bit 1
và phía nam khác. Các bit được lật sau khi anh ta rời đi. Ví dụ:
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)
Với kích thước của thị trấn và hồ sơ của người đàn ông, hãy tính điểm đến của người đàn ông sau nhiều n
ngày.
Đầu vào:
Trong dòng đầu tiên là ba số nguyên h
, w
và n
.
Trong các h
dòng sau đây là w
số nguyên, biểu thị hồ sơ của người đàn ông.
h <= 1000, w <= 1000, n <= 1000000000
Đầu ra:
Hai số nguyên, biểu thị đích đến của người đàn ông sau nhiều n
ngày.
Đầu vào mẫu:
3 4 3
1 0 1 1
0 1 0 0
1 0 1 0
Đầu ra mẫu:
0 4
Mã mẫu:
#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;
}
Ghi điểm:
- Số byte thấp nhất trong UTF-8 thắng.
- Nếu thời gian chạy mã của bạn độc lập
n
, hãy giảm 50% số điểm của bạn.- Đừng chỉ tính kết quả của tất cả 1000000000 ngày hoặc làm bất cứ điều gì tương tự ngu ngốc để nhận phần thưởng này. Tìm một thuật toán hiệu quả!
n
, mã của tôi tính kết quả của tất cả 1000000000 ngày, sau đó xuất kết quả n
, tôi vẫn nhận được tiền thưởng -50% chứ?