I appreciate your help, my code produced the same result as yours for those input cases, but it still gives me WA.
Code: Select all
#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <vector>
#include <algorithm>
using namespace std;
struct cell
{
int horizontal, vertical, diagonal, antidiagonal;
};
struct pt
{
int x, y;
};
inline void ins(pt *dst, int idx, int x, int y)
{
dst[idx].x = x;
dst[idx].y = y;
}
inline bool ketemu(pt *dst, int m, int x, int y)
{
for(int i = 0; i < m; i++)
if(dst[i].x == x && dst[i].y == y)
return true;
return false;
}
cell otable[1000][1000], xtable[1000][1000];
char table[1001][1001];
pt Otemp[1000], Xtemp[1000];
int main()
{
int cases, n, m, i, j, owins, xwins, filled, n1, maxm, jmlo, jmlx, dif, cellsize, k, found;
bool error;
freopen("input.txt", "r", stdin);
scanf("%i", &cases);
while(cases--)
{
jmlo = jmlx = owins = xwins = filled = 0;
error = false;
scanf("%i %i", &n, &m);
cellsize = n * 4 * 4;
for(i = 0; i < n; i++)
{
scanf(" %s ", table[i]);
memset(otable[i],0,cellsize);
memset(xtable[i],0,cellsize);
}
if(n == 1)
{
if(table[0][0] == '.') printf("IN PROGRESS\n");
else if(table[0][0] == 'O') printf("ERROR\n");
else if(table[0][0] == 'X') printf("X WINS\n");
continue;
}
//if(m > n) { printf("IN PROGRESS\n"); continue; }
n1 = n - 1; // batas tabel
maxm = 2 * m - 1; // cek panjang maksimum
for(i = 0; i < n; i++)
{
for(j = 0; j < n && !error; j++)
{
if(table[i][j] == 'O')
{
jmlo++;
filled++;
xtable[i][j].antidiagonal = xtable[i][j].diagonal = xtable[i][j].horizontal =
xtable[i][j].vertical = 0;
if(i > 0 && j > 0)
{
otable[i][j].diagonal = otable[i-1][j-1].diagonal + 1;
if(otable[i][j].diagonal > maxm)
error = true;
}
else
otable[i][j].diagonal = 1;
if(i > 0 && j < n1)
{
otable[i][j].antidiagonal = otable[i-1][j+1].antidiagonal + 1;
if(otable[i][j].antidiagonal > maxm)
error = true;
}
else
otable[i][j].antidiagonal = 1;
if(j > 0)
{
otable[i][j].horizontal = otable[i][j-1].horizontal + 1;
if(otable[i][j].horizontal > maxm)
error = true;
}
else
otable[i][j].horizontal = 1;
if(i > 0)
{
otable[i][j].vertical = otable[i-1][j].vertical + 1;
if(otable[i][j].vertical > maxm)
error = true;
}
else
otable[i][j].vertical = 1;
if(otable[i][j].vertical == m || otable[i][j].horizontal == m || otable[i][j].diagonal == m ||
otable[i][j].antidiagonal == m)
{
if(owins == 0)
{
if(otable[i][j].vertical == m)
{
for(k = 0; k < m; k++)
ins(Otemp, k, j, i-k);
//ins(Otemp, j, i-m, j, i, 1);
}
else if(otable[i][j].horizontal == m)
{
for(k = 0; k < m; k++)
ins(Otemp, k, j-k, i);
//ins(Otemp, j-m, i, j, i, 2);
}
else if(otable[i][j].diagonal == m)
{
for(k = 0; k < m; k++)
ins(Otemp, k, j-k, i-k);
//ins(Otemp, j-m, i-m, j, i, 3);
}
else
{
for(k = 0; k < m; k++)
ins(Otemp, k, j+k, i-k);
}
//ins(Otemp, j+m, i-m, j-m, i, 1);
owins++;
}
else
{
found = 0;
if(otable[i][j].vertical == m)
{
for(k = 0; k < m; k++)
if(ketemu(Otemp,m,j,i-k)) { found++; break; }
//if(find(Otemp.begin(), Otemp.end Otemp.insert(Otemp.end(), new vector<pt>(j,i-k));
}
else if(otable[i][j].horizontal == m)
{
for(k = 0; k < m; k++)
if(ketemu(Otemp,m,j-k,i)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j-k,i));
}
else if(otable[i][j].diagonal == m)
{
for(k = 0; k < m; k++)
if(ketemu(Otemp,m,j-k,i-k)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j-k,i-k));
}
else
{
for(k = 0; k < m; k++)
if(ketemu(Otemp,m,j+k,i-k)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j+k,i-k));
}
if(found == 0)
error = true;
}
}
}
else if(table[i][j] == 'X')
{
jmlx++;
filled++;
otable[i][j].antidiagonal = otable[i][j].diagonal = otable[i][j].horizontal =
otable[i][j].vertical = 0;
if(i > 0 && j > 0)
{
xtable[i][j].diagonal = xtable[i-1][j-1].diagonal + 1;
if(xtable[i][j].diagonal > maxm)
error = true;
}
else
xtable[i][j].diagonal = 1;
if(i > 0 && j < n1)
{
xtable[i][j].antidiagonal = xtable[i-1][j+1].antidiagonal + 1;
if(xtable[i][j].antidiagonal > maxm)
error = true;
}
else
xtable[i][j].antidiagonal = 1;
if(j > 0)
{
xtable[i][j].horizontal = xtable[i][j-1].horizontal + 1;
if(xtable[i][j].horizontal > maxm)
error = true;
}
else
xtable[i][j].horizontal = 1;
if(i > 0)
{
xtable[i][j].vertical = xtable[i-1][j].vertical + 1;
if(xtable[i][j].vertical > maxm)
error = true;
}
else
xtable[i][j].vertical = 1;
if(xtable[i][j].vertical == m || xtable[i][j].horizontal == m || xtable[i][j].diagonal == m ||
xtable[i][j].antidiagonal == m)
{
if(xwins == 0)
{
if(xtable[i][j].vertical == m)
{
for(k = 0; k < m; k++)
ins(Xtemp, k, j, i-k);
}
//ins(Otemp, j, i-m, j, i, 1);
else if(xtable[i][j].horizontal == m)
{
for(k = 0; k < m; k++)
ins(Xtemp, k, j-k, i);
}
//ins(Otemp, j-m, i, j, i, 2);
else if(xtable[i][j].diagonal == m)
{
for(k = 0; k < m; k++)
ins(Xtemp, k, j-k, i-k);
}
//ins(Otemp, j-m, i-m, j, i, 3);
else
{
for(k = 0; k < m; k++)
ins(Xtemp, k, j+k, i-k);
}
//ins(Otemp, j+m, i-m, j-m, i, 1);
xwins++;
}
else
{
found = 0;
if(xtable[i][j].vertical == m)
{
for(k = 0; k < m; k++)
if(ketemu(Xtemp,m,j,i-k)) { found++; break; }
//if(find(Otemp.begin(), Otemp.end Otemp.insert(Otemp.end(), new vector<pt>(j,i-k));
}
else if(xtable[i][j].horizontal == m)
{
for(k = 0; k < m; k++)
if(ketemu(Xtemp,m,j-k,i)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j-k,i));
}
else if(xtable[i][j].diagonal == m)
{
for(k = 0; k < m; k++)
if(ketemu(Xtemp,m,j-k,i-k)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j-k,i-k));
}
else
{
for(k = 0; k < m; k++)
if(ketemu(Xtemp,m,j+k,i-k)) { found++; break; }
//Otemp.insert(Otemp.end(), new vector<pt>(j+k,i-k));
}
if(found == 0)
error = true;
}
}
}
}
}
dif = jmlx - jmlo;
if(!(dif == 0 || dif == 1))
error = true;
if(xwins + owins > 1)
error = true;
if(error)
printf("ERROR\n");
else if(xwins == 1)
printf("X WINS\n");
else if(owins == 1)
printf("O WINS\n");
else if(filled == n * n)
printf("DRAW\n");
else
printf("IN PROGRESS\n");
}
return 0;
}