Pagini recente » Cod sursa (job #559643) | Cod sursa (job #2702295) | Cod sursa (job #1612032) | Cod sursa (job #2418952) | Cod sursa (job #543812)
Cod sursa(job #543812)
#include <iostream>
#include <stdio.h>
using namespace std;
int N;
const int nmax = 101;
int what[nmax][nmax], C[nmax * nmax][4], cul[2][nmax][nmax], affair[nmax][nmax];
void read()
{
freopen ("pixels.in","r",stdin);
freopen ("pixels.out","w",stdout);
scanf("%d",&N);
int k, i, j;
for(k = 0; k < 2; k++)
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
scanf("%d",&cul[k][i][j]);
for(i = 1; i <= N * N; i++)
scanf("%d %d %d %d",&C[i][0],&C[i][1],&C[i][2],&C[i][3]);
}
int di[4] = {-1,0,+1,0},
dj[4] = {0,+1,0,-1};
void initial()
{
int i, j;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
if(cul[0][i][j] < cul[1][i][j])
what[i][j] = 1;
}
int total()
{
int tot = 0;
int i, j, k, x;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
{
x = cul[what[i][j]][i][j];
for(k = 1; k < 3; k++)
if(what[i][j] != what[i + di[k]][j + dj[k]])
x -= C[(i - 1) * N + j][k];
tot += x;
}
return tot;
}
int maxnou;
int actual(int i, int j, int col)
{
int k;
int c = cul[col][i][j];
for(k = 0; k <= 3; k++)
if(col != what[i + di[k]][j + dj[k]])
c -= C[(i - 1) * N + j][k];
return c;
}
void solve()
{
int i, j, cat, dif, isw, jsw;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
affair[i][j] = actual(i, j, what[i][j]);
while(true)
{
cat = 0;
for(i = 1; i <= N; i++)
for(j = 1; j <= N; j++)
{
dif = actual(i, j, 1 - what[i][j]);
if(dif > affair[i][j])
if( cat < dif - affair[i][j])
{
cat = dif - affair[i][j];
isw = i;
jsw = j;
}
}
if(cat > 0)
{
what[isw][jsw] = 1 - what[isw][jsw];
affair[i][j] = actual(isw, jsw, what[isw][jsw]);
}
else break;
}
printf("%d\n",total());
for(i = 1; i <= N; i++)
{
for(j = 1; j <= N; j++)
printf("%d ", what[i][j]);
printf("\n");
}
}
int main()
{
read();
initial();
solve();
return 0;
}