#include <stdio.h>
#include <stdlib.h>
#define MS 5
#define may x
#define nguoi o
typedef enum { e, x, o} xo;
void inBanCo( xo ( * bc) [ MS] ) ;
void tinhDiem( xo ( * bc) [ MS] , int ( * diem) [ MS] ) ;
void mayDi( xo ( * bc) [ MS] , int ( * diem) [ MS] ) ;
int win( xo ( * bc) [ MS] , int ( * diem) [ MS] ) ;
int hetO( xo ( * bc) [ MS] ) ;
int checkHang( xo ( * bc) [ MS] , int hang, xo ben) ;
int checkCot( xo ( * bc) [ MS] , int cot, xo ben) ;
int checkDuongCheo1( xo ( * bc) [ MS] , xo ben) ;
int checkDuongCheo2( xo ( * bc) [ MS] , xo ben) ;
int full0( int ( * diem) [ MS] ) ;
int checkWin( xo ( * bc) [ MS] , xo ben) ;
int checkWinHang( xo ( * bc) [ MS] , int h, xo ben) ;
int checkWinCot( xo ( * bc) [ MS] , int c, xo ben) ;
int checkWinDuongCheo1( xo ( * bc) [ MS] , xo ben) ;
int checkWinDuongCheo2( xo ( * bc) [ MS] , xo ben) ;
void cls( ) ;
int main( ) {
int n, m;
int diem[ MS] [ MS] ;
xo banCo[ MS] [ MS] = { { e} } ;
while ( ! win( banCo, diem) ) {
cls( ) ;
inBanCo( banCo) ;
do {
do {
printf ( "\n Ban danh o (hang - cot): " ) ; if ( m < 0 || n < 0 || m > MS || n > MS)
printf ( "\n Khong co o do\n \n " ) ; } while ( m < 0 || n < 0 || m > MS || n > MS) ;
if ( banCo[ m - 1 ] [ n - 1 ] != e)
printf ( "\n Khong the danh o nay\n " ) ; } while ( banCo[ m - 1 ] [ n - 1 ] != e) ;
banCo[ m - 1 ] [ n - 1 ] = nguoi;
tinhDiem( banCo, diem) ;
mayDi( banCo, diem) ;
}
return 0 ;
}
int checkDuongCheo2( xo ( * bc) [ MS] , xo ben) {
int count = 0 ;
for ( int k = 0 ; k < MS; k++ )
if ( bc[ k] [ MS - k - 1 ] == ben)
count++;
return count;
}
int checkDuongCheo1( xo ( * bc) [ MS] , xo ben) {
int count = 0 ;
for ( int k = 0 ; k < MS; k++ )
if ( bc[ k] [ k] == ben)
count++;
return count;
}
int checkCot( xo ( * bc) [ MS] , int cot, xo ben) {
int count = 0 ;
for ( int i = 0 ; i < MS; i++ )
if ( bc[ i] [ cot] == ben)
count++;
return count;
}
int checkHang( xo ( * bc) [ MS] , int hang, xo ben) {
int count = 0 ;
for ( int i = 0 ; i < MS; i++ )
if ( bc[ hang] [ i] == ben)
count++;
return count;
}
void cls( ) {
}
int hetO( xo ( * bc) [ MS] ) {
for ( int i = 0 ; i < MS; i++ )
for ( int j = 0 ; j < MS; j++ )
if ( bc[ i] [ j] == e)
return 0 ;
return 1 ;
}
int full0( int ( * diem) [ MS] ) {
for ( int i = 0 ; i < MS; i++ )
for ( int j = 0 ; j < MS; j++ )
if ( diem[ i] [ j] != 0 )
return 0 ;
return 1 ;
}
int checkWinHang( xo ( * bc) [ MS] , int h, xo ben) {
for ( int i = 0 ; i < MS; i++ )
if ( bc[ h] [ i] != ben)
return 0 ;
return 1 ;
}
int checkWinCot( xo ( * bc) [ MS] , int c, xo ben) {
for ( int i = 0 ; i < MS; i++ )
if ( bc[ i] [ c] != ben)
return 0 ;
return 1 ;
}
int checkWinDuongCheo1( xo ( * bc) [ MS] , xo ben) {
for ( int k = 0 ; k < MS; k++ )
if ( bc[ k] [ k] != ben)
return 0 ;
return 1 ;
}
int checkWinDuongCheo2( xo ( * bc) [ MS] , xo ben) {
for ( int k = 0 ; k < MS; k++ )
if ( bc[ k] [ MS - k - 1 ] != ben)
return 0 ;
return 1 ;
}
int checkWin( xo ( * bc) [ MS] , xo ben) {
for ( int k = 0 ; k < MS; k++ ) {
if ( checkWinHang( bc, k, ben) )
return 1 ;
else if ( checkWinCot( bc, k, ben) )
return 1 ;
}
if ( checkWinDuongCheo1( bc, ben) || checkWinDuongCheo2( bc, ben) )
return 1 ;
return 0 ;
}
int win( xo ( * bc) [ MS] , int ( * diem) [ MS] ) {
if ( checkWin( bc, nguoi) ) {
cls( ) ;
inBanCo( bc) ;
return 1 ;
}
if ( checkWin( bc, may) ) {
cls( ) ;
inBanCo( bc) ;
return 1 ;
}
if ( full0( diem) ) {
cls( ) ;
inBanCo( bc) ;
return 1 ;
}
if ( hetO( bc) ) {
cls( ) ;
inBanCo( bc) ;
return 1 ;
}
return 0 ;
}
void mayDi( xo ( * bc) [ MS] , int ( * diem) [ MS] ) {
int k = 0 , l = 0 ;
for ( int i = 0 ; i < MS; i++ )
for ( int j = 0 ; j < MS; j++ )
if ( diem[ k] [ l] <= diem[ i] [ j] && bc[ i] [ j] == e) {
k = i;
l = j;
}
bc[ k] [ l] = may;
}
void inDiem( int ( * diem) [ MS] ) {
for ( int i = 0 ; i < MS; i++ ) {
for ( int j = 0 ; j < MS; j++ )
}
}
void tinhDiem( xo ( * bc) [ MS] , int ( * diem) [ MS] ) {
for ( int i = 0 ; i < MS; i++ )
for ( int j = 0 ; j < MS; j++ ) {
diem[ i] [ j] = 0 ;
if ( j == i || i == MS - j - 1 )
diem[ i] [ j] ++;
}
int n = 0 , m = 0 ;
for ( int i = 0 ; i < MS; i++ ) {
if ( checkCot( bc, i, nguoi) && checkCot( bc, i, may) )
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ i] = 0 ;
if ( checkHang( bc, i, nguoi) && checkHang( bc, i, may) )
for ( int k = 0 ; k < MS; k++ )
diem[ i] [ k] = 0 ;
}
n = 0 , m = 0 ;
if ( ( n = checkDuongCheo1( bc, nguoi) ) && ( m = checkDuongCheo1( bc, may) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ k] = 0 ;
else
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ k] += ( m > n ? m : n) ;
n = 0 , m = 0 ;
if ( ( n = checkDuongCheo2( bc, nguoi) ) && ( m = checkDuongCheo2( bc, may) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ MS - k - 1 ] = 0 ;
else
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ MS - k - 1 ] += ( m > n ? m : n) ;
for ( int i = 0 ; i < MS; i++ ) {
n = 0 , m = 0 ;
if ( ( ( n = checkCot( bc, i, nguoi) ) && ! checkCot( bc, i, may) ) || ( m = checkCot( bc, i, may) && ! checkCot( bc, i, nguoi) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ i] += ( m > n ? m : n) ;
n = 0 , m = 0 ;
if ( ( ( n = checkHang( bc, i, nguoi) ) && ! checkHang( bc, i, may) ) || ( m = checkHang( bc, i, may) && ! checkHang( bc, i, nguoi) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ i] [ k] += ( m > n ? m : n) ;
int emt = 0 ;
if ( ( emt = checkCot( bc, i, e) && ! checkCot( bc, i, may) && ! checkCot( bc, i, nguoi) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ k] [ i] += emt;
emt = 0 ;
if ( ( emt = checkHang( bc, i, e) && ! checkHang( bc, i, may) && ! checkHang( bc, i, nguoi) ) )
for ( int k = 0 ; k < MS; k++ )
diem[ i] [ k] += emt;
}
for ( int i = 0 ; i < MS; i++ )
for ( int j = 0 ; j < MS; j++ )
if ( bc[ i] [ j] == nguoi || bc[ i] [ j] == may)
diem[ i] [ j] = 0 ;
}
void inBanCo( xo ( * bc) [ MS] ) {
for ( int i = 0 ; i < MS; i++ ) {
for ( int j = 0 ; j < MS; j++ )
if ( bc[ i] [ j] == e)
else if ( bc[ i] [ j] == x)
else
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNkZWZpbmUgTVMgNQojZGVmaW5lIG1heSB4CiNkZWZpbmUgbmd1b2kgbwoKdHlwZWRlZiBlbnVtIHtlLCB4LCBvfSB4bzsKCnZvaWQgaW5CYW5Dbyh4byAoKmJjKVtNU10pOwp2b2lkIHRpbmhEaWVtKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKTsKdm9pZCBtYXlEaSh4byAoKmJjKVtNU10sIGludCAoKmRpZW0pW01TXSk7CmludCB3aW4oeG8gKCpiYylbTVNdLCBpbnQgKCpkaWVtKVtNU10pOwppbnQgaGV0Tyh4byAoKmJjKVtNU10pOwppbnQgY2hlY2tIYW5nKHhvICgqYmMpW01TXSwgaW50IGhhbmcsIHhvIGJlbik7CmludCBjaGVja0NvdCh4byAoKmJjKVtNU10sIGludCBjb3QsIHhvIGJlbik7CmludCBjaGVja0R1b25nQ2hlbzEoeG8gKCpiYylbTVNdLCB4byBiZW4pOwppbnQgY2hlY2tEdW9uZ0NoZW8yKHhvICgqYmMpW01TXSwgeG8gYmVuKTsKaW50IGZ1bGwwKGludCAoKmRpZW0pW01TXSk7CmludCBjaGVja1dpbih4byAoKmJjKVtNU10sIHhvIGJlbik7CmludCBjaGVja1dpbkhhbmcoeG8gKCpiYylbTVNdLCBpbnQgaCwgeG8gYmVuKTsKaW50IGNoZWNrV2luQ290KHhvICgqYmMpW01TXSwgaW50IGMsIHhvIGJlbik7CmludCBjaGVja1dpbkR1b25nQ2hlbzEoeG8gKCpiYylbTVNdLCB4byBiZW4pOwppbnQgY2hlY2tXaW5EdW9uZ0NoZW8yKHhvICgqYmMpW01TXSwgeG8gYmVuKTsKdm9pZCBjbHMoKTsKCmludCBtYWluKCkgewoJaW50IG4sIG07CglpbnQgZGllbVtNU11bTVNdOwoJeG8gYmFuQ29bTVNdW01TXSA9IHt7ZX19OwoKCXdoaWxlICghd2luKGJhbkNvLCBkaWVtKSkgewoJCWNscygpOwoJCWluQmFuQ28oYmFuQ28pOwoJCWRvIHsKCQkJZG8gewoJCQkJcHJpbnRmKCJcbkJhbiBkYW5oIG8gKGhhbmcgLSBjb3QpOiAiKTsKCQkJCXNjYW5mKCIlZCAlZCIsICZtLCAmbik7CgkJCQlpZiAobSA8IDAgfHwgbiA8IDAgfHwgbSA+IE1TIHx8IG4gPiBNUykKCQkJCQlwcmludGYoIlxuS2hvbmcgY28gbyBkb1xuXG4iKTsKCQkJfSB3aGlsZSAobSA8IDAgfHwgbiA8IDAgfHwgbSA+IE1TIHx8IG4gPiBNUyk7CgkJCWlmIChiYW5Db1ttIC0gMV1bbiAtIDFdICE9IGUpCgkJCQlwcmludGYoIlxuS2hvbmcgdGhlIGRhbmggbyBuYXlcbiIpOwoJCX0gd2hpbGUgKGJhbkNvW20gLSAxXVtuIC0gMV0gIT0gZSk7CgkJYmFuQ29bbSAtIDFdW24gLSAxXSA9IG5ndW9pOwoJCXRpbmhEaWVtKGJhbkNvLCBkaWVtKTsKCQltYXlEaShiYW5DbywgZGllbSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCmludCBjaGVja0R1b25nQ2hlbzIoeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWludCBjb3VudCA9IDA7Cglmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJaWYgKGJjW2tdW01TIC0gayAtIDFdID09IGJlbikKCQkJY291bnQrKzsKCXJldHVybiBjb3VudDsKfQoKaW50IGNoZWNrRHVvbmdDaGVvMSh4byAoKmJjKVtNU10sIHhvIGJlbikgewoJaW50IGNvdW50ID0gMDsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQlpZiAoYmNba11ba10gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9CgppbnQgY2hlY2tDb3QoeG8gKCpiYylbTVNdLCBpbnQgY290LCB4byBiZW4pIHsKCWludCBjb3VudCA9IDA7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJaWYgKGJjW2ldW2NvdF0gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9CgppbnQgY2hlY2tIYW5nKHhvICgqYmMpW01TXSwgaW50IGhhbmcsIHhvIGJlbikgewoJaW50IGNvdW50ID0gMDsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlpZiAoYmNbaGFuZ11baV0gPT0gYmVuKQoJCQljb3VudCsrOwoJcmV0dXJuIGNvdW50Owp9Cgp2b2lkIGNscygpIHsKCXN5c3RlbSgiY2xzIik7Cn0KCmludCBoZXRPKHhvICgqYmMpW01TXSkgewoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKQoJCWZvciAoaW50IGogPSAwOyBqIDwgTVM7IGorKykKCQkJaWYgKGJjW2ldW2pdID09IGUpCgkJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgZnVsbDAoaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKQoJCQlpZiAoZGllbVtpXVtqXSAhPSAwKQoJCQkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKaW50IGNoZWNrV2luSGFuZyh4byAoKmJjKVtNU10sIGludCBoLCB4byBiZW4pIHsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlpZiAoYmNbaF1baV0gIT0gYmVuKQoJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgY2hlY2tXaW5Db3QoeG8gKCpiYylbTVNdLCBpbnQgYywgeG8gYmVuKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJaWYgKGJjW2ldW2NdICE9IGJlbikKCQkJcmV0dXJuIDA7CglyZXR1cm4gMTsKfQoKaW50IGNoZWNrV2luRHVvbmdDaGVvMSh4byAoKmJjKVtNU10sIHhvIGJlbikgewoJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCWlmIChiY1trXVtrXSAhPSBiZW4pCgkJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCmludCBjaGVja1dpbkR1b25nQ2hlbzIoeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQlpZiAoYmNba11bTVMgLSBrIC0gMV0gIT0gYmVuKQoJCQlyZXR1cm4gMDsKCXJldHVybiAxOwp9CgppbnQgY2hlY2tXaW4oeG8gKCpiYylbTVNdLCB4byBiZW4pIHsKCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykgewoJCWlmIChjaGVja1dpbkhhbmcoYmMsIGssIGJlbikpCgkJCXJldHVybiAxOwoJCWVsc2UgaWYgKGNoZWNrV2luQ290KGJjLCBrLCBiZW4pKQoJCQlyZXR1cm4gMTsKCX0KCWlmIChjaGVja1dpbkR1b25nQ2hlbzEoYmMsIGJlbikgfHwgY2hlY2tXaW5EdW9uZ0NoZW8yKGJjLCBiZW4pKQoJCXJldHVybiAxOwoJcmV0dXJuIDA7Cn0KCmludCB3aW4oeG8gKCpiYylbTVNdLCBpbnQgKCpkaWVtKVtNU10pIHsKCWlmIChjaGVja1dpbihiYywgbmd1b2kpKSB7CgkJY2xzKCk7CgkJaW5CYW5DbyhiYyk7CgkJcHJpbnRmKCJcbk5ndW9pIHRoYW5nXG4iKTsKCQlyZXR1cm4gMTsKCX0KCWlmIChjaGVja1dpbihiYywgbWF5KSkgewoJCWNscygpOwoJCWluQmFuQ28oYmMpOwoJCXByaW50ZigiXG5NYXkgdGhhbmdcbiIpOwoJCXJldHVybiAxOwoJfQoJaWYgKGZ1bGwwKGRpZW0pKSB7CgkJY2xzKCk7CgkJaW5CYW5DbyhiYyk7CgkJcHJpbnRmKCJcbkhvYSBjb1xuIik7CgkJcmV0dXJuIDE7Cgl9CglpZiAoaGV0TyhiYykpIHsKCQljbHMoKTsKCQlpbkJhbkNvKGJjKTsKCQlwcmludGYoIlxuSG9hIGNvXG4iKTsKCQlyZXR1cm4gMTsKCX0KCXJldHVybiAwOwp9Cgp2b2lkIG1heURpKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKSB7CglpbnQgayA9IDAsIGwgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKQoJCWZvciAoaW50IGogPSAwOyBqIDwgTVM7IGorKykKCQkJaWYgKGRpZW1ba11bbF0gPD0gZGllbVtpXVtqXSAmJiBiY1tpXVtqXSA9PSBlKSB7CgkJCQlrID0gaTsKCQkJCWwgPSBqOwoJCQl9CgliY1trXVtsXSA9IG1heTsKfQoKdm9pZCBpbkRpZW0oaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IE1TOyBqKyspCgkJCXByaW50ZigiJWQgIiwgZGllbVtpXVtqXSk7CgkJcHJpbnRmKCJcbiIpOwoJfQp9Cgp2b2lkIHRpbmhEaWVtKHhvICgqYmMpW01TXSwgaW50ICgqZGllbSlbTVNdKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IE1TOyBpKyspCgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKSB7CgkJCWRpZW1baV1bal0gPSAwOwoJCQlpZiAoaiA9PSBpIHx8IGkgPT0gTVMgLSBqIC0gMSkKCQkJCWRpZW1baV1bal0rKzsKCQl9CglpbnQgbiA9IDAsIG0gPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKSB7CgkJaWYgKGNoZWNrQ290KGJjLCBpLCBuZ3VvaSkgJiYgY2hlY2tDb3QoYmMsIGksIG1heSkpCgkJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJCWRpZW1ba11baV0gPSAwOwoJCWlmIChjaGVja0hhbmcoYmMsIGksIG5ndW9pKSAmJiBjaGVja0hhbmcoYmMsIGksIG1heSkpCgkJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJCWRpZW1baV1ba10gPSAwOwoJfQoJbiA9IDAsIG0gPSAwOwoJaWYgKChuID0gY2hlY2tEdW9uZ0NoZW8xKGJjLCBuZ3VvaSkpICYmIChtID0gY2hlY2tEdW9uZ0NoZW8xKGJjLCBtYXkpKSkKCQlmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJCWRpZW1ba11ba10gPSAwOwoJZWxzZQoJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJZGllbVtrXVtrXSArPSAobSA+IG4gPyBtIDogbik7CgluID0gMCwgbSA9IDA7CglpZiAoKG4gPSBjaGVja0R1b25nQ2hlbzIoYmMsIG5ndW9pKSkgJiYgKG0gPSBjaGVja0R1b25nQ2hlbzIoYmMsIG1heSkpKQoJCWZvciAoaW50IGsgPSAwOyBrIDwgTVM7IGsrKykKCQkJZGllbVtrXVtNUyAtIGsgLSAxXSA9IDA7CgllbHNlCgkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQlkaWVtW2tdW01TIC0gayAtIDFdICs9IChtID4gbiA/IG0gOiBuKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykgewoJCW4gPSAwLCBtID0gMDsKCQlpZiAoKChuID0gY2hlY2tDb3QoYmMsIGksIG5ndW9pKSkgJiYgIWNoZWNrQ290KGJjLCBpLCBtYXkpKSB8fCAobSA9IGNoZWNrQ290KGJjLCBpLCBtYXkpICYmICFjaGVja0NvdChiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtrXVtpXSArPSAobSA+IG4gPyBtIDogbik7CgkJbiA9IDAsIG0gPSAwOwoJCWlmICgoKG4gPSBjaGVja0hhbmcoYmMsIGksIG5ndW9pKSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbWF5KSkgfHwgKG0gPSBjaGVja0hhbmcoYmMsIGksIG1heSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtpXVtrXSArPSAobSA+IG4gPyBtIDogbik7CgkJaW50IGVtdCA9IDA7CgkJaWYgKChlbXQgPSBjaGVja0NvdChiYywgaSwgZSkgJiYgIWNoZWNrQ290KGJjLCBpLCBtYXkpICYmICFjaGVja0NvdChiYywgaSwgbmd1b2kpKSkKCQkJZm9yIChpbnQgayA9IDA7IGsgPCBNUzsgaysrKQoJCQkJZGllbVtrXVtpXSArPSBlbXQ7CgkJZW10ID0gMDsKCQlpZiAoKGVtdCA9IGNoZWNrSGFuZyhiYywgaSwgZSkgJiYgIWNoZWNrSGFuZyhiYywgaSwgbWF5KSAmJiAhY2hlY2tIYW5nKGJjLCBpLCBuZ3VvaSkpKQoJCQlmb3IgKGludCBrID0gMDsgayA8IE1TOyBrKyspCgkJCQlkaWVtW2ldW2tdICs9IGVtdDsKCX0KCWZvciAoaW50IGkgPSAwOyBpIDwgTVM7IGkrKykKCQlmb3IgKGludCBqID0gMDsgaiA8IE1TOyBqKyspCgkJCWlmIChiY1tpXVtqXSA9PSBuZ3VvaSB8fCBiY1tpXVtqXSA9PSBtYXkpCgkJCQlkaWVtW2ldW2pdID0gMDsKfQoKdm9pZCBpbkJhbkNvKHhvICgqYmMpW01TXSkgewoJcHJpbnRmKCJcbiIpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBNUzsgaSsrKSB7CgkJZm9yIChpbnQgaiA9IDA7IGogPCBNUzsgaisrKQoJCQlpZiAoYmNbaV1bal0gPT0gZSkKCQkJCXByaW50ZigifCAiKTsKCQkJZWxzZSBpZiAoYmNbaV1bal0gPT0geCkKCQkJCXByaW50ZigifFgiKTsKCQkJZWxzZQoJCQkJcHJpbnRmKCJ8TyIpOwoJCXByaW50ZigifFxuIik7Cgl9Cn0K