Przerabiam sobie zadania z OIG i utknąłem na tym http://www.main.edu.pl/user.phtml?op=showtask&task=kwa&con=OIG4. Rozwiązanie oparłem na wzorze z http://pl.wikipedia.org/wiki/Kwadrat_magiczny_%28matematyka%29, niby banalne, ale main wyrzuca mi integer out of range, co chyba znaczy, że mój program daje wyniki ujemne dla niektórych pól. Jeśli się komuś chce to prosiłbym o pomoc w rozwiązaniu, oto kod:
#include <cstdio>
using namespace std;
typedef long long int LL;
const int MAX_SIZE = 1000 + 5;
LL A[MAX_SIZE][MAX_SIZE];
LL val[MAX_SIZE];
int n;
void read()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
scanf("%lld", &A[i][j]);
}
void fill()
{
LL max;
if(A[0][0] != 0 && A[n - 1][n - 1] != 0)
max = ((A[0][0] + A[n - 1][n - 1]) * (LL)n) / 2;
else
max = ((A[0][n - 1] + A[n - 1][0]) * (LL)n) / 2;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
val[i] += A[i][j];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
if(A[i][j] == 0)
{
A[i][j] = max - val[i];
break;
}
}
void print()
{
for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%lld ", A[i][j]);
printf("\n");
}
}
int main()
{
read();
fill();
print();
return 0;
}
</url>