#include<stdio.h>
// test
int main (void)
{
int g[5][5] =
{
{ 1,0,0,0,0 },
{ 0,0,1,0,0 },
{ 0,1,1,1,1 },
{ 1,0,1,0,0 },
{ 0,0,0,1,0 }
};
printf("\n 4-way solution = %d \n", mmd4
(5,5,g
, 2,2)); printf("\n 8-way solution = %d \n", mmd8
(5,5,g
, 2,2));
return 0;
}
// 8-way Solution
int mmd8(int h, int w, int g[h][w], int x, int y)
{
return max8(mmd8_up (h,w,g,x-1,y ,1),
mmd8_down (h,w,g,x+1,y ,1),
mmd8_left (h,w,g,x ,y-1,1),
mmd8_right(h,w,g,x ,y+1,1),
mmd8_uleft (h,w,g,x-1,y-1,1),
mmd8_uright(h,w,g,x-1,y+1,1),
mmd8_dleft (h,w,g,x+1,y-1,1),
mmd8_dright(h,w,g,x+1,y+1,1));
}
int mmd8_up(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max4(g[x][y]?steps:0,
mmd8_up (h,w,g,x-1,y ,steps+1),
mmd8_uleft (h,w,g,x-1,y-1,steps+1),
mmd8_uright(h,w,g,x-1,y+1,steps+1));
}
int mmd8_down(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max4(g[x][y]?steps:0,
mmd8_down (h,w,g,x+1,y ,steps+1),
mmd8_dleft (h,w,g,x+1,y-1,steps+1),
mmd8_dright(h,w,g,x+1,y+1,steps+1));
}
int mmd8_left(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_left (h,w,g,x ,y-1,steps+1),
mmd8_uleft(h,w,g,x-1,y-1,steps+1),
mmd8_dleft(h,w,g,x+1,y-1,steps+1));
}
int mmd8_right(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_right (h,w,g,x ,y+1,steps+1),
mmd8_uright(h,w,g,x-1,y+1,steps+1),
mmd8_dright(h,w,g,x+1,y+1,steps+1));
}
int mmd8_uleft(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_uleft(h,w,g,x-1,y-1,steps+1));
}
int mmd8_uright(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_uright(h,w,g,x-1,y+1,steps+1));
}
int mmd8_dleft(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_dleft(h,w,g,x+1,y-1,steps+1));
}
int mmd8_dright(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd8_dright(h,w,g,x+1,y+1,steps+1));
}
// 4-way Solution
int mmd4(int h, int w, int g[h][w], int x, int y)
{
return max4(mmd_up (h,w,g,x-1,y ,1),
mmd_down (h,w,g,x+1,y ,1),
mmd_left (h,w,g,x ,y-1,1),
mmd_right(h,w,g,x ,y+1,1));
}
int mmd_up(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max4(g[x][y]?steps:0,
mmd_up (h,w,g,x-1,y ,steps+1),
mmd_left (h,w,g,x ,y-1,steps+1),
mmd_right(h,w,g,x ,y+1,steps+1));
}
int mmd_down(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max4(g[x][y]?steps:0,
mmd_down (h,w,g,x+1,y ,steps+1),
mmd_left (h,w,g,x ,y-1,steps+1),
mmd_right(h,w,g,x ,y+1,steps+1));
}
int mmd_left(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd_left (h,w,g,x ,y-1,steps+1));
}
int mmd_right(int h, int w, int g[h][w], int x, int y, int steps)
{
if (base_case(h,w,x,y)) return 0;
return max2(g[x][y]?steps:0,
mmd_right(h,w,g,x ,y+1,steps+1));
}
// Utility Functions
int base_case(int h, int w, int x, int y)
{
if (x < 0) return 1;
if (y < 0) return 1;
if (x >= h) return 1;
if (y >= w) return 1;
return 0;
}
int max2(int a, int b)
{
return ((a > b) ? a : b);
}
int max4(int a, int b, int c, int d)
{
int m = a;
if (b > m) m = b;
if (c > m) m = c;
if (d > m) m = d;
return m;
}
int max8(int a, int b, int c, int d, int e, int f, int g, int h)
{
int m = a;
if (b > m) m = b;
if (c > m) m = c;
if (d > m) m = d;
if (e > m) m = e;
if (f > m) m = f;
if (g > m) m = g;
if (h > m) m = h;
return m;
}
I2luY2x1ZGU8c3RkaW8uaD4KCi8vIHRlc3QKCmludCBtYWluICh2b2lkKQp7CiAgICBpbnQgZ1s1XVs1XSA9CiAgICB7CiAgICAgIHsgMSwwLDAsMCwwIH0sCiAgICAgIHsgMCwwLDEsMCwwIH0sCiAgICAgIHsgMCwxLDEsMSwxIH0sCiAgICAgIHsgMSwwLDEsMCwwIH0sCiAgICAgIHsgMCwwLDAsMSwwIH0KICAgIH07CiAgICAKICAgIHByaW50ZigiXG4gNC13YXkgc29sdXRpb24gPSAlZCBcbiIsIG1tZDQoNSw1LGcsIDIsMikpOwogICAgcHJpbnRmKCJcbiA4LXdheSBzb2x1dGlvbiA9ICVkIFxuIiwgbW1kOCg1LDUsZywgMiwyKSk7CiAgICAKICAgIHJldHVybiAwOwp9CgovLyA4LXdheSBTb2x1dGlvbgoKaW50IG1tZDgoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5KQp7CiAgICBwdXRjaGFyKCcjJyk7CiAgICByZXR1cm4gbWF4OChtbWQ4X3VwICAgKGgsdyxnLHgtMSx5ICAsMSksCiAgICAgICAgICAgICAgICBtbWQ4X2Rvd24gKGgsdyxnLHgrMSx5ICAsMSksCiAgICAgICAgICAgICAgICBtbWQ4X2xlZnQgKGgsdyxnLHggICx5LTEsMSksCiAgICAgICAgICAgICAgICBtbWQ4X3JpZ2h0KGgsdyxnLHggICx5KzEsMSksCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIG1tZDhfdWxlZnQgKGgsdyxnLHgtMSx5LTEsMSksCiAgICAgICAgICAgICAgICBtbWQ4X3VyaWdodChoLHcsZyx4LTEseSsxLDEpLAogICAgICAgICAgICAgICAgbW1kOF9kbGVmdCAoaCx3LGcseCsxLHktMSwxKSwKICAgICAgICAgICAgICAgIG1tZDhfZHJpZ2h0KGgsdyxnLHgrMSx5KzEsMSkpOwp9CgppbnQgbW1kOF91cChpbnQgaCwgaW50IHcsIGludCBnW2hdW3ddLCBpbnQgeCwgaW50IHksIGludCBzdGVwcykKewogICAgaWYgKGJhc2VfY2FzZShoLHcseCx5KSkgcmV0dXJuIDA7CiAgICBwdXRjaGFyKCdVJyk7CiAgICByZXR1cm4gbWF4NChnW3hdW3ldP3N0ZXBzOjAsCiAgICAgICAgICAgbW1kOF91cCAgICAoaCx3LGcseC0xLHkgICxzdGVwcysxKSwKICAgICAgICAgICBtbWQ4X3VsZWZ0IChoLHcsZyx4LTEseS0xLHN0ZXBzKzEpLAogICAgICAgICAgIG1tZDhfdXJpZ2h0KGgsdyxnLHgtMSx5KzEsc3RlcHMrMSkpOwp9CgppbnQgbW1kOF9kb3duKGludCBoLCBpbnQgdywgaW50IGdbaF1bd10sIGludCB4LCBpbnQgeSwgaW50IHN0ZXBzKQp7CiAgICBpZiAoYmFzZV9jYXNlKGgsdyx4LHkpKSByZXR1cm4gMDsKICAgIHB1dGNoYXIoJ0QnKTsKICAgIHJldHVybiBtYXg0KGdbeF1beV0/c3RlcHM6MCwKICAgICAgICAgICBtbWQ4X2Rvd24gIChoLHcsZyx4KzEseSAgLHN0ZXBzKzEpLAogICAgICAgICAgIG1tZDhfZGxlZnQgKGgsdyxnLHgrMSx5LTEsc3RlcHMrMSksCiAgICAgICAgICAgbW1kOF9kcmlnaHQoaCx3LGcseCsxLHkrMSxzdGVwcysxKSk7Cn0KCmludCBtbWQ4X2xlZnQoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5LCBpbnQgc3RlcHMpCnsKICAgIGlmIChiYXNlX2Nhc2UoaCx3LHgseSkpIHJldHVybiAwOwogICAgcHV0Y2hhcignTCcpOwogICAgcmV0dXJuIG1heDIoZ1t4XVt5XT9zdGVwczowLAogICAgICAgICAgIG1tZDhfbGVmdCAoaCx3LGcseCAgLHktMSxzdGVwcysxKSwKICAgICAgICAgICBtbWQ4X3VsZWZ0KGgsdyxnLHgtMSx5LTEsc3RlcHMrMSksCiAgICAgICAgICAgbW1kOF9kbGVmdChoLHcsZyx4KzEseS0xLHN0ZXBzKzEpKTsKfQoKaW50IG1tZDhfcmlnaHQoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5LCBpbnQgc3RlcHMpCnsKICAgIGlmIChiYXNlX2Nhc2UoaCx3LHgseSkpIHJldHVybiAwOwogICAgcHV0Y2hhcignUicpOwogICAgcmV0dXJuIG1heDIoZ1t4XVt5XT9zdGVwczowLAogICAgICAgICAgIG1tZDhfcmlnaHQgKGgsdyxnLHggICx5KzEsc3RlcHMrMSksCiAgICAgICAgICAgbW1kOF91cmlnaHQoaCx3LGcseC0xLHkrMSxzdGVwcysxKSwKICAgICAgICAgICBtbWQ4X2RyaWdodChoLHcsZyx4KzEseSsxLHN0ZXBzKzEpKTsKfQoKaW50IG1tZDhfdWxlZnQoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5LCBpbnQgc3RlcHMpCnsKICAgIGlmIChiYXNlX2Nhc2UoaCx3LHgseSkpIHJldHVybiAwOwogICAgcHV0Y2hhcignVycpOwogICAgcmV0dXJuIG1heDIoZ1t4XVt5XT9zdGVwczowLAogICAgICAgICAgIG1tZDhfdWxlZnQoaCx3LGcseC0xLHktMSxzdGVwcysxKSk7Cn0KCmludCBtbWQ4X3VyaWdodChpbnQgaCwgaW50IHcsIGludCBnW2hdW3ddLCBpbnQgeCwgaW50IHksIGludCBzdGVwcykKewogICAgaWYgKGJhc2VfY2FzZShoLHcseCx5KSkgcmV0dXJuIDA7CiAgICBwdXRjaGFyKCdYJyk7CiAgICByZXR1cm4gbWF4MihnW3hdW3ldP3N0ZXBzOjAsCiAgICAgICAgICAgbW1kOF91cmlnaHQoaCx3LGcseC0xLHkrMSxzdGVwcysxKSk7Cn0KCmludCBtbWQ4X2RsZWZ0KGludCBoLCBpbnQgdywgaW50IGdbaF1bd10sIGludCB4LCBpbnQgeSwgaW50IHN0ZXBzKQp7CiAgICBpZiAoYmFzZV9jYXNlKGgsdyx4LHkpKSByZXR1cm4gMDsKICAgIHB1dGNoYXIoJ1knKTsKICAgIHJldHVybiBtYXgyKGdbeF1beV0/c3RlcHM6MCwKICAgICAgICAgICBtbWQ4X2RsZWZ0KGgsdyxnLHgrMSx5LTEsc3RlcHMrMSkpOwp9CgppbnQgbW1kOF9kcmlnaHQoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5LCBpbnQgc3RlcHMpCnsKICAgIGlmIChiYXNlX2Nhc2UoaCx3LHgseSkpIHJldHVybiAwOwogICAgcHV0Y2hhcignWicpOwogICAgcmV0dXJuIG1heDIoZ1t4XVt5XT9zdGVwczowLAogICAgICAgICAgIG1tZDhfZHJpZ2h0KGgsdyxnLHgrMSx5KzEsc3RlcHMrMSkpOwp9CgovLyA0LXdheSBTb2x1dGlvbgoKaW50IG1tZDQoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5KQp7CiAgICBwdXRjaGFyKCcjJyk7CiAgICByZXR1cm4gbWF4NChtbWRfdXAgICAoaCx3LGcseC0xLHkgICwxKSwKICAgICAgICAgICAgICAgIG1tZF9kb3duIChoLHcsZyx4KzEseSAgLDEpLAogICAgICAgICAgICAgICAgbW1kX2xlZnQgKGgsdyxnLHggICx5LTEsMSksCiAgICAgICAgICAgICAgICBtbWRfcmlnaHQoaCx3LGcseCAgLHkrMSwxKSk7Cn0KCmludCBtbWRfdXAoaW50IGgsIGludCB3LCBpbnQgZ1toXVt3XSwgaW50IHgsIGludCB5LCBpbnQgc3RlcHMpCnsKICAgIGlmIChiYXNlX2Nhc2UoaCx3LHgseSkpIHJldHVybiAwOwogICAgcHV0Y2hhcignVScpOwogICAgcmV0dXJuIG1heDQoZ1t4XVt5XT9zdGVwczowLAogICAgICAgICAgIG1tZF91cCAgIChoLHcsZyx4LTEseSAgLHN0ZXBzKzEpLAogICAgICAgICAgIG1tZF9sZWZ0IChoLHcsZyx4ICAseS0xLHN0ZXBzKzEpLAogICAgICAgICAgIG1tZF9yaWdodChoLHcsZyx4ICAseSsxLHN0ZXBzKzEpKTsKfQoKaW50IG1tZF9kb3duKGludCBoLCBpbnQgdywgaW50IGdbaF1bd10sIGludCB4LCBpbnQgeSwgaW50IHN0ZXBzKQp7CiAgICBpZiAoYmFzZV9jYXNlKGgsdyx4LHkpKSByZXR1cm4gMDsKICAgIHB1dGNoYXIoJ0QnKTsKICAgIHJldHVybiBtYXg0KGdbeF1beV0/c3RlcHM6MCwKICAgICAgICAgICBtbWRfZG93biAoaCx3LGcseCsxLHkgICxzdGVwcysxKSwKICAgICAgICAgICBtbWRfbGVmdCAoaCx3LGcseCAgLHktMSxzdGVwcysxKSwKICAgICAgICAgICBtbWRfcmlnaHQoaCx3LGcseCAgLHkrMSxzdGVwcysxKSk7Cn0KCmludCBtbWRfbGVmdChpbnQgaCwgaW50IHcsIGludCBnW2hdW3ddLCBpbnQgeCwgaW50IHksIGludCBzdGVwcykKewogICAgaWYgKGJhc2VfY2FzZShoLHcseCx5KSkgcmV0dXJuIDA7CiAgICBwdXRjaGFyKCdMJyk7CiAgICByZXR1cm4gbWF4MihnW3hdW3ldP3N0ZXBzOjAsCiAgICAgICAgICAgbW1kX2xlZnQgKGgsdyxnLHggICx5LTEsc3RlcHMrMSkpOwp9CgppbnQgbW1kX3JpZ2h0KGludCBoLCBpbnQgdywgaW50IGdbaF1bd10sIGludCB4LCBpbnQgeSwgaW50IHN0ZXBzKQp7CiAgICBpZiAoYmFzZV9jYXNlKGgsdyx4LHkpKSByZXR1cm4gMDsKICAgIHB1dGNoYXIoJ1InKTsKICAgIHJldHVybiBtYXgyKGdbeF1beV0/c3RlcHM6MCwKICAgICAgICAgICBtbWRfcmlnaHQoaCx3LGcseCAgLHkrMSxzdGVwcysxKSk7Cn0KCi8vIFV0aWxpdHkgRnVuY3Rpb25zCgppbnQgYmFzZV9jYXNlKGludCBoLCBpbnQgdywgaW50IHgsIGludCB5KQp7CglpZiAoeCA8IDApIHJldHVybiAxOwoJaWYgKHkgPCAwKSByZXR1cm4gMTsKCWlmICh4ID49IGgpIHJldHVybiAxOwoJaWYgKHkgPj0gdykgcmV0dXJuIDE7CiAgICByZXR1cm4gMDsKfQoKaW50IG1heDIoaW50IGEsIGludCBiKQp7CiAgICByZXR1cm4gKChhID4gYikgPyBhIDogYik7Cn0KCmludCBtYXg0KGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKQp7CiAgICBpbnQgbSA9IGE7CiAgICBpZiAoYiA+IG0pIG0gPSBiOwogICAgaWYgKGMgPiBtKSBtID0gYzsKICAgIGlmIChkID4gbSkgbSA9IGQ7CiAgICByZXR1cm4gbTsKfQoKaW50IG1heDgoaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQsIGludCBlLCBpbnQgZiwgaW50IGcsIGludCBoKQp7CiAgICBpbnQgbSA9IGE7CiAgICBpZiAoYiA+IG0pIG0gPSBiOwogICAgaWYgKGMgPiBtKSBtID0gYzsKICAgIGlmIChkID4gbSkgbSA9IGQ7CiAgICBpZiAoZSA+IG0pIG0gPSBlOwogICAgaWYgKGYgPiBtKSBtID0gZjsKICAgIGlmIChnID4gbSkgbSA9IGc7CiAgICBpZiAoaCA+IG0pIG0gPSBoOwogICAgcmV0dXJuIG07Cn0K