рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдПрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░реЗрдВ

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдирдереБрде рдХреЗ "рдЕрд▓реНрдЧреЛрд░рд┐рдердо рдПрдХреНрд╕" рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рд╕реБрдВрджрд░рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕реБрдбреЛрдХреВ рдХреЛ рдХрд┐рд╕реА рднреА рдЙрдиреНрдирдд рд╕рдорд╛рдзрд╛рди рддрдХрдиреАрдХреЛрдВ рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдЬрд▓реНрджреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдпрд╣ рд╕рдм рд╢реБрд░реВ рд╣реБрдЖ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдпреВрд▓рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде, рдЬрд╣рд╛рдВ, рдПрдХ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 50 рд╕реБрдбреЛрдХреВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдЦреЛрдЬ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦрдХрд░ рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рд╕рдорд╛рдзрд╛рди рдХреА рдЧрддрд┐ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрд╕рдВрддреЛрд╖ рдерд╛ред рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧ рд╕реБрдбреЛрдХреБ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдбреЛрдирд╛рд▓реНрдб рдиреЙрдЯ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрд▓реНрдЧреЛрд░рд┐рдердо рдПрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред


рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдПрдХреНрд╕


рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдпрд╛, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдпрд╣ рдПрдХ "рдЕрд╕рддрдд рдкрд╣реЗрд▓реА" рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЙрдкрд▓рдмреНрдз рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ:


  • рдХрдИ рдПрд╕ рд╣реИрдВ
  • рдЗрд╕ рд╕реЗрдЯ рдХреЗ рд╕рдмрд╕реЗрдЯ Y рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ
  • рдХрд╛рд░реНрдп рд╡рд╛рдИ рд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдРрд╕реЗ рддрддреНрд╡ рд╡рд╛рдИ * рдХрд┐ рдПрд╕ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рд╡рд╛рдИ * рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрдЯ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред
  • рдпрд╣реА рд╣реИ, Y рдореЗрдВ рд╕рднреА рд╕реЗрдЯреЛрдВ рдХрд╛ рдорд┐рд▓рди рд╕реЗрдЯ S рдХреЛ рдврдВрдХрддрд╛ рд╣реИ (рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ), рдФрд░ Y * рдореЗрдВ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХреЛрдИ рдЬреЛрдбрд╝-рддреЛрдбрд╝ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИрдВ

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ
рдПрд╕ = {рез, реи, рей, рек, рел} рдФрд░
Y = { A = {1, 2},
рдмреА = {реи, рей},
C = {1, 5},
D = {1, 4},
E = {5}}
рд╕реЗрдЯ рдмреА , рдбреА, рдФрд░ рдИ рд╕реЗрдЯ рдПрд╕ рдХрд╛ рдПрдХ рд╕рдЯреАрдХ рдХрд╡рд░ рдмрдирд╛рддреЗ рд╣реИрдВ ред


рдПрдХреНрд╕ рдирде рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП, рд╕реЗрдЯ рд╡рд╛рдИ рдХреЛ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡ рд╡рд╛рдИ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдП рдЖрдИ, рдЬреЗ = 1, рдЕрдЧрд░ рдПрд╕ рдЬреЗ рд╡рд╛рдИ рдореЗрдВ рд╣реИ ред рдпрд╛рдиреА рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:


Y i \ _ j12345
рдПрдХ11000
рдмреА01100
рд╕реА10001
рдбреА10010
рдП00001

рд╕рдЯреАрдХ рдХрд╡рд░реЗрдЬ рдЦреЛрдЬ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


  • рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛: рд╕реЗрдЯ рдПрд╕ рдФрд░ рд╡рд╛рдИ ; рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд╡рд░реЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЧрдП рд╕реЗрдЯреЛрдВ рдХрд╛ Stack (рд╢реБрд░реВ рдореЗрдВ рдЦрд╛рд▓реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рддрддреНрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ)
    1. рдпрджрд┐ рд╕реЗрдЯ рдПрд╕ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╡рд╛рдВрдЫрд┐рдд рдХрд╡рд░ рд╕реНрдЯреИрдХ рдкрд░ рд╣реИред
    2. рдпрджрд┐ рд╕реЗрдЯ рд╡рд╛рдИ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рдХрд╡рд░рд┐рдВрдЧ рдирд╣реАрдВ рдорд┐рд▓реАред
    3. рд╣рдо рд╕реЗрдЯ S рдореЗрдВ рдЙрд╕ рддрддреНрд╡ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ Y рдореЗрдВ рд╕реЗрдЯ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИ ред
    4. Y рд╕реЗ рдЪреБрдиреЗрдВ рд╕рднреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ X рд╣реИ ред
    5. рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП, 6-9 рджреЛрд╣рд░рд╛рдПрдВред
    6. рдПрдХ рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╡рд░реЗрдЬ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ X рдХреЛ рд╕реНрдЯреИрдХ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
    7. рд╣рдо S ' рдФрд░ Y' рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ: S ' S рд╡рд╣ рд╣реИ рдЬрд┐рд╕рд╕реЗ X рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕рднреА рддрддреНрд╡ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ , Y' Y рд╕реЗ рдРрд╕реЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ X рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
    8. рд╣рдо рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо X рдХреЛ S ' , Y' рдФрд░ Stack ред
    9. рдпрджрд┐ рдпрд╣ рдЪрд░рдг 7 рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдХрд┐ рдХрд╡рд░реЗрдЬ рдЕрд╕рдВрднрд╡ рд╣реИ, рддреЛ Stack рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рддрддреНрд╡ рдХреЛ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЕрдЧрд▓реЗ рдПрдХреНрд╕ рдкрд░ рдЬрд╛рдПрдВред рдпрджрд┐ рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддреЗ рд╣реИрдВред
    10. рдпрджрд┐ рдХрд┐рд╕реА рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рд╣рд▓ рдирд╣реАрдВ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ - рдЧрд╣рд░рд╛рдИ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдЦреЛрдЬред рд╡реИрд╕реЗ, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рд╢реБрд░реВ рдореЗрдВ рд╕реНрдЯреИрдХ рдХреЛ рдЧреИрд░-рд░рд┐рдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛ "рд╕рдЯреАрдХ рдХрд╡рд░реЗрдЬ рдЦреЛрдЬреЗрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдЯреИрдХ рдкрд░ рдЭреВрда рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рд╕реВрдХреНрд╖реНрдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╡рд╛рдИ рдореЗрдВ рд╕реЗрдЯ "рдЫреЛрдЯрд╛" рд╣реИ, рдЕрд░реНрдерд╛рддред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрд╣реБрдд рд╡рд┐рд░рд▓ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирдХ рднрдВрдбрд╛рд░рдг рдХреЗ рджреМрд░рд╛рди рд╕реНрддрдВрднреЛрдВ рдХреЗ рдмреАрдЪ рдЪреМрд░рд╛рд╣реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд░реВрдк рд╕реЗ рд▓рдВрдмрд╛ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдирдЯ рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ "рдбрд╛рдВрд╕рд┐рдВрдЧ рд▓рд┐рдВрдХ" рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ ред рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ рджреНрд╡рд┐-рдЖрдпрд╛рдореА рджреЛрдЧреБрдиреА рд▓рд┐рдВрдХреНрдб рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╕реНрддрдВрдн рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЗрдХрд╛рдЗрдпрд╛рдВ рд╣реИрдВред рд╕реВрдЪреА рдореЗрдВ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрддрдВрдн рдореЗрдВ рдЕрдЧрд▓реЗ рдФрд░ рдкрд┐рдЫрд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдВрдХ рднреА рд╣реИрдВред рдпрд╣ рд╕рдВрдЧрдарди рдЖрдкрдХреЛ рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрдиреЗ рдкрд░ O ( m * n ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ O (1) рд╕рдордп рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╡рд┐рд░рд▓ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдХреЙрд▓рдо рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЕрд▓реА рдЕрд╕рдл рд╕рд╣рдпреЛрдЧреА рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд╛рдВрд╕рд┐рдВрдЧ рд▓рд┐рдВрдХ рдХреЗ рддрдВрддреНрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдХреА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╢рд╛рдмреНрджрд┐рдХ рд░реВрдк рд╕реЗ рдХрдИ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдПрдХреНрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред


рд╡рд┐рдЪрд╛рд░, рджреЛрдиреЛрдВ рд╕реНрддрдВрднреЛрдВ рдФрд░ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рд╣рдЪрд░реНрдп рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реИред рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╣рдо рдкрдВрдХреНрддрд┐ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдЬрд┐рд╕рдореЗрдВ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ, рдХреНрд░рдорд╢рдГ, рд╕реНрддрдВрдн рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдореЗрдВ рдЧреИрд░-рдЕрдХреНрд╖реАрдп рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдиреБрдХреНрд░рдорд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд░реЗрдВрдЧреЗ, рдПрдХ рд╕рд░рдгреА рдореЗрдВ, рд╣рдо рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирде рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдкрдВрдХреНрддрд┐ рд╕реЗ рдХрд┐рд╕реА рддрддреНрд╡ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдХреЙрд▓рдо рд╕реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рд╣рдЯрд╛рддреЗ рд╕рдордп, рд╕рднреА рд╕реНрддрдВрднреЛрдВ рд╕реЗ рдЗрд╕рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ (рдФрд░ рдЬрдм рдЗрд╕реЗ рд╕рднреА рд╕реНрддрдВрднреЛрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрдВрдХреНрддрд┐ "рд╕реНрд╡рдпрдВ" рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ)ред


рдЬреВрд▓рд┐рдпрд╛ рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред
рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:


 Y = Dict( 'A' => [1, 2], 'B' => [2, 3], 'C' => [1, 5], 'D' => [1, 4], 'E' => [5] ) S = Dict( 1 => Set(['A', 'C', 'D']), 2 => Set(['A', 'B']), 3 => Set(['B']), 4 => Set(['D']), 5 => Set(['C', 'E']) ) 

рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдЬреЛ рджрд┐рдП рдЧрдП рдПрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рд╕реНрдерд╛рди рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред


 function extract_intersects!(rows, columns, base_row) buf = [] for elt in rows[base_row] #        push!(buf, pop!(columns, elt)) #         for intersecting_row in buf[end] for other_elt in rows[intersecting_row] if other_elt != elt delete!(columns[other_elt], intersecting_row) end end end end return buf end function restore_intersects!(rows, columns, base_row, buf) #       base_row  ,      for elt in Iterators.reverse(rows[base_row]) columns[elt] = pop!(buf) for added_row in columns[elt] for col in rows[added_row] push!(columns[col], added_row) end end end end 

рдЗрди рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рднрдВрдбрд╛рд░рдг рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред extract_intersects!() рдлрд╝рдВрдХреНрд╢рди, рдмрд╛рд╣рд░реА рд▓реВрдк рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдкрд░, рдЙрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛ base_row рд╕рд╛рде рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рджреЗрдЦреЗ рдЧрдП рддрддреНрд╡реЛрдВ рдХреЛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо push!(columns[col], added_row) рдореЗрдВ columns[col] push!(columns[col], added_row) рдХреЙрд▓ push!(columns[col], added_row) рдХреЗ рд╕рдордп рдЕрдВрддрд░рддрдо рд▓реВрдк рдореЗрдВ, рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ push!(columns[col], added_row) extract_intersects!() рдХреЙрд▓рдо рд╕реЗ рддрддреНрд╡ рдЕрдкрдиреЗ рдореВрд▓ рд╕реНрдерд╛рди рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред


рдЕрдм рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо X рд╣реА:


 function algorithm_x(rows, columns, cover = []) if isempty(columns) return cover else #       m, c = findmin(Dict(k => length(v) for (k, v) in columns)) for subset in collect(columns[c]) push!(cover, subset) #     #   subset  buf_cols = extract_intersects!(rows, columns, subset) s = algorithm_x(rows, columns, cover) #     - ,  s == nothing || return s restore_intersects!(rows, columns, subset, buf_cols) pop!(cover) end #      columns[c] , #        return nothing end end 

рд╕реБрдбреЛрдХреВ


рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ, рдорд╛рдорд▓рд╛ рдЫреЛрдЯрд╛ рд╣реИ - рд╕рдЯреАрдХ рдХрд╡рд░реЗрдЬ рдЦреЛрдЬрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдбреЛрдХреВ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред


рд╣рдо рдЙрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╣рд▓ рдХрд┐рдП рдЧрдП рд╕реБрдбреЛрдХреВ рджреНрд╡рд╛рд░рд╛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:


  1. рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ 1 рд╕реЗ 9 рддрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИ (рдпрд╛ рдПрдХ рдЕрд▓рдЧ рдЖрдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рд╣рд▓ рд╣реЛрдиреЗ рдкрд░ n 2 рддрдХ )ред
  2. рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдмрд╛рд░ рд╣реЛрддреА рд╣реИред
  3. рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓рдо рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдмрд╛рд░ рд╣реЛрддреА рд╣реИред
  4. рдкреНрд░рддреНрдпреЗрдХ рдЪрддреБрд░реНрдерд╛рдВрд╢ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдмрд╛рд░ рд╣реЛрддреА рд╣реИред

рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдареАрдХ 1 рдмрд╛рд░ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рдд рд╡реЗ рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдореЗрдВ 4 n 2 рддрддреНрд╡ (рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдХреЙрд▓рдо) рд╣реИрдВред


рдЬрд┐рди рд╕рдмрд╕реЗрдЯреНрд╕ рдкрд░ рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдмрдирддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 1 рдкрдВрдХреНрддрд┐ рдФрд░ 4 рд╕реНрддрдВрднреЛрдВ рдХреЗ рдЪреМрд░рд╛рд╣реЗ рдкрд░ рдирдВрдмрд░ 9 рд╕реЗрд▓ рдореЗрдВ "рдПрдХ рдЙрдкрд╕рдореВрд╣" рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ (1,4) рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, 1 рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рдирдВрдмрд░ 9 рд╣реИ, 4 рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ 9 рд╣реИ, 2 рдЪрддреБрд░реНрдерд╛рдВрд╢реЛрдВ рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ 9 рд╣реИ (рд╕рд╛рдорд╛рдиреНрдп рдХрд╛ рдЕрд░реНрде рд╣реИ) рд╕реБрдбреЛрдХреВ 9 ├Ч 9)ред


рдЙрд╕рдХреЗ рдмрд╛рдж, рд╕рдорд╛рдзрд╛рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред


 #    9├Ч9,      #   -   (row, col, num) #  : # (0, row, col) -   row  col   # (1, row, num) -   row   num # (2, col, num) -   col   num # (3, q, num) -   q   num function xsudoku(puzzle::AbstractMatrix{Int}) rows = Dict() cols = Dict() #   for row in 1:9, col in 1:9, num in 1:9 r = [] quad = ((row-1)├╖3)*3 + (col-1)├╖3 + 1 push!(r, (0, row, col), (1, row, num), (2, col, num), (3, quad, num)) rows[(row, col, num)] = r end #   for type in 0:3, n1 in 1:9, n2 in 1:9 cols[(type, n1, n2)] = Set() end for (rk, rv) in rows for v in rv push!(cols[v], rk) end end # s -    #  ,     ,    s = [] for i in 1:9, j in 1:9 if puzzle[i, j] > 0 elt = (i, j, puzzle[i,j]) push!(s, elt) #    ,       extract_intersects!(rows, cols, elt) end end # ,   -   success = algorithm_x(rows, cols, s) success != nothing || return nothing #      ret = similar(puzzle) for (i, j, num) in s ret[i,j] = num end return ret end 

рдЖрдЗрдП рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:


  julia> @time xsudoku([0 0 0 0 0 0 4 0 0; 3 0 6 0 0 0 0 0 0; 0 0 0 1 9 6 0 3 0; 0 7 0 0 0 0 0 1 0; 8 0 0 2 5 0 0 9 0; 0 4 0 0 0 0 8 0 0; 0 6 0 4 0 9 0 0 8; 0 0 5 0 0 0 0 2 0; 0 0 0 5 0 0 0 0 7]) 0.006326 seconds (54.91 k allocations: 3.321 MiB) 9├Ч9 Array{Int64,2}: 1 5 7 8 3 2 4 6 9 3 9 6 7 4 5 2 8 1 2 8 4 1 9 6 7 3 5 6 7 2 9 8 4 5 1 3 8 3 1 2 5 7 6 9 4 5 4 9 6 1 3 8 7 2 7 6 3 4 2 9 1 5 8 4 1 5 3 7 8 9 2 6 9 2 8 5 6 1 3 4 7 

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдЧрддрд┐ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реБрдбреЛрдХреВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрдХрдиреАрдХ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ рдпрд╛ рдпрд╣рд╛рдВ ) рд╡рд╛рдВрдЫрд┐рдд рд╕реЗрдЯ рдФрд░ рдХрд╡рд░ рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рд░рдЦреА рдирд╣реАрдВ рдЧрдИ рдереАред

Source: https://habr.com/ru/post/hi462411/


All Articles