สมมติว่าเราได้รับตารางขนาด h * w ทุกเซลล์ในกริดมีค่าเฉพาะที่กำหนดให้กับเซลล์นั้น เราต้องขยายเซลล์ให้มีค่าที่เท่ากัน ในการดำเนินการดังกล่าว เราสามารถเลือกเซลล์ที่ยังไม่เคยเลือกมาก่อนได้ จากนั้นจึงลดค่าลง 1 เซลล์ปัจจุบันและเพิ่มค่าขึ้น 1 เซลล์ที่อยู่ติดกับเซลล์ปัจจุบันในแนวตั้งหรือแนวนอน เราพิมพ์จำนวนการดำเนินการและหมายเลขเซลล์ของการดำเนินการเพิ่มและลด ผลลัพธ์จะอยู่ในรูปแบบด้านล่าง -
-
จำนวนการดำเนินการ
-
ที่ 1 (ตำแหน่งเซลล์ลดลง) - (ตำแหน่งเซลล์เพิ่มขึ้น)
....
-
nth (ตำแหน่งเซลล์ลดลง) - (ตำแหน่งเซลล์เพิ่มขึ้น)
ดังนั้น หากอินพุตเป็น 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)ก่อน>ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
กำหนดผลลัพธ์อาร์เรย์ใหม่ที่มี tuplefor initialize i :=0 when i0 แล้ว:แทรก tuple(i, j - 1, i, j) ที่ส่วนท้ายของผลลัพธ์ grid[i, j] :=grid[i, j] + tp ถ้า grid[i, j] mod 2 เหมือนกับ 1 และ j 0 จากนั้น:แทรก tuple(i - 1, w - 1, i, w - 1) ที่ส่วนท้ายของ resultgrid [i, w - 1] :=grid[i, w - 1] + tpif grid[i, w - 1] mod 2 เหมือนกับ 1 แล้ว:grid[i, w - 1] :=grid[i, w - 1] - 1tp :=1Otherwisetp :=0print(size of result) for initialize i :=0 when i ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#includeใช้เนมสเปซ std;void แก้ปัญหา(int h, int w, vector >grid){ vector > ผลลัพธ์; สำหรับ(int i =0; i 0){ result.push_back(make_tuple(i, j-1, i, j)); ตาราง[i][j] +=tp; } if(grid[i][j]%2 ==1 &&j 0){ result.push_back(make_tuple(i-1, w-1, i, w-1)); ตาราง[i][w-1] +=tp; } if(grid[i][w-1]%2 ==1){ grid[i][w-1] -=1; tp =1; } อื่น ๆ tp =0; } cout <<(int)result.size() < (result[i]) <<", " < (ผลลัพธ์[i]) <<")" <<" - (" <<รับ<2>(ผลลัพธ์[i]) <<", " <<รับ<3>(ผลลัพธ์[i]) <<") "; ศาล <<'\ n'; }}int main() { int ชั่วโมง =3, w =3; เวกเตอร์<เวกเตอร์ > กริด ={{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}; แก้(h, w, กริด); คืนค่า 0;} อินพุต
3, 3, {{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)ก่อน>