สมมติว่าเราได้รับกริดขนาด h × w ซึ่งทุกเซลล์ในกริดมีค่าเฉพาะตัวที่กำหนดไว้ เราต้องการเพิ่มจำนวนเซลล์ที่มีค่าเป็นเลขคู่ให้มากที่สุด โดยสามารถทำได้โดยการเลือกเซลล์ที่ยังไม่เคยเลือก แล้วลดค่าของเซลล์นั้นลง 1 และเพิ่มค่าของเซลล์ที่อยู่ติดกันในแนวตั้งหรือแนวนอนขึ้น 1 โปรแกรมจะแสดงผลลัพธ์เป็นจำนวนการดำเนินการ และตำแหน่งของเซลล์ที่ลดและเพิ่มค่า ในรูปแบบดังนี้:
- จำนวนการดำเนินการ
- ตำแหน่งเซลล์ที่ลด - ตำแหน่งเซลล์ที่เพิ่ม (สำหรับแต่ละขั้นตอน)
ตัวอย่างเช่น หากอินพุตคือ h = 3, w = 3, grid = {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}} ผลลัพธ์จะเป็น:
4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)
ขั้นตอนการแก้ปัญหา
- สร้างอาร์เรย์
resultเพื่อเก็บลำดับการดำเนินการ (tuple 4 ค่า) - วนลูปแถว (
i = 0 ถึง h-1):- กำหนดตัวแปร
tp = 0 - วนลูปคอลัมน์ (
j = 0 ถึง w-1):- ถ้า
tp > 0ให้เพิ่ม tuple(i, j-1, i, j)เข้าresultและเพิ่มgrid[i][j] += tp - ถ้า
grid[i][j] % 2 == 1และj < w-1ให้ลดgrid[i][j]--และตั้งtp = 1 - มิฉะนั้นตั้ง
tp = 0
- ถ้า
- กำหนดตัวแปร
- รีเซ็ต
tp = 0แล้ววนลูปแถวอีกครั้งเพื่อจัดการคอลัมน์สุดท้าย (w-1):- ถ้า
tp > 0เพิ่ม tuple(i-1, w-1, i, w-1)และgrid[i][w-1] += tp - ถ้า
grid[i][w-1] % 2 == 1ให้ลดค่าลง 1 และตั้งtp = 1มิฉะนั้นtp = 0
- ถ้า
- พิมพ์ขนาดของ
resultและรายการ tuple ทั้งหมด
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void solve(int h, int w, vector<vector<int>> grid) {
vector<tuple<int,int,int,int>> result;
for(int i = 0; i < h; i++) {
int tp = 0;
for(int j = 0; j < w; j++) {
if(tp > 0) {
result.push_back(make_tuple(i, j-1, i, j));
grid[i][j] += tp;
}
if(grid[i][j] % 2 == 1 && j < w-1) {
grid[i][j] -= 1;
tp = 1;
} else {
tp = 0;
}
}
}
tp = 0;
for(int i = 0; i < h; i++) {
if(tp > 0) {
result.push_back(make_tuple(i-1, w-1, i, w-1));
grid[i][w-1] += tp;
}
if(grid[i][w-1] % 2 == 1) {
grid[i][w-1] -= 1;
tp = 1;
} else {
tp = 0;
}
}
cout << (int)result.size() << endl;
for(int i = 0; i < (int)result.size(); i++) {
cout << "(" << get<0>(result[i]) << ", " << get<1>(result[i])
<< ") - (" << get<2>(result[i]) << ", " << get<3>(result[i]) << ")";
cout << '\n';
}
}
int main() {
int h = 3, w = 3;
vector<vector<int>> grid = {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}};
solve(h, w, grid);
return 0;
}
อินพุต / เอาต์พุต
Input: 3, 3, {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}
Output: 4 (0, 1) - (0, 2) (2, 0) - (2, 1) (2, 1) - (2, 2) (0, 2) - (1, 2)