poj 2329 Nearest number - 2

来源:互联网 发布:数据降维方法 编辑:程序博客网 时间:2024/06/05 02:53

三维dp数组实现

#include<iostream>#include<string.h>#include<math.h>#include<fstream>#include<algorithm>#include<stdio.h>#include<queue>#include<vector> #define MAXSIZE 100using namespace std;const int INF = 1<<30;#define max(a, b) ((a) > (b) ? (a) : (b))#define min(a, b) ((a) < (b) ? (a) : (b))int matrix[210][210];int target[210][210];int dyna[4][210][210];int main (){    //freopen("data_2329.txt","r",stdin);    int n, i, j, k, l, st, ed, dis, r;    scanf("%d", &n);    for (k = 0; k < 4; k++)    {        for (i = 0; i <= n + 1; i++)        {            for (j = 0; j <= n + 1; j++)                dyna[k][i][j] = INF;        }    }    for (i = 1; i <= n; i++)    {        for (j = 1; j <= n; j++)            scanf("%d", &matrix[i][j]);    }    for (i = 2; i <= 2 * n; i++)    {        if (i <= n + 1) st = i - 1, ed = 1;        else st = n, ed = i - n;        for (j = st; j >= ed; j--)        {            if (matrix[j][i - j]) dyna[0][j][i - j] = 0;            else dyna[0][j][i - j] = min(dyna[0][j][i - j - 1] + 1, dyna[0][j - 1][i - j] + 1);            if (matrix[n - j + 1][i - j]) dyna[1][n - j + 1][i - j] = 0;            else dyna[1][n - j + 1][i - j] = min(dyna[1][n - j + 1][i - j - 1] + 1, dyna[1][n - j + 2][i - j] + 1);            if (matrix[j][n - i + j + 1]) dyna[2][j][n - i + j + 1] = 0;            else dyna[2][j][n - i + j + 1] = min(dyna[2][j][n - i + j + 2] + 1, dyna[2][j - 1][n - i + j + 1] + 1);            if (matrix[n - j + 1][n - i + j + 1]) dyna[3][n - j + 1][n - i + j + 1] = 0;            else dyna[3][n - j + 1][n - i + j + 1] = min(dyna[3][n - j + 2][n - i + j + 1] + 1, dyna[3][n - j + 1][n - i + j + 2] + 1);        }    }    for (i = 1; i <= n; i++)    {        for (j = 1; j <= n; j++)        {            if (matrix[i][j]) target[i][j] = matrix[i][j];            else            {                dis = min(min(dyna[0][i][j], dyna[1][i][j]), min(dyna[2][i][j], dyna[3][i][j]));                r = -1;                if (dis < INF) for (k = 0; k <= dis; k++)                {                    l = dis - k;                    if (i - k >= 1 && j - l >= 1)                    {                          if (matrix[i - k][j - l])                          {                             if (r == -1) r = matrix[i - k][j - l];                             else { r = 0; break; }                          }                    }                    if (i + k <= n && j - l >= 1 && k != 0)                    {                          if (matrix[i + k][j - l])                          {                             if (r == -1) r = matrix[i + k][j - l];                             else { r = 0; break; }                          }                    }                    if (i - k >= 1 && j + l <= n && l != 0)                    {                          if (matrix[i - k][j + l])                          {                             if (r == -1) r = matrix[i - k][j + l];                             else { r = 0; break; }                          }                    }                    if (i + k <= n && j + l <= n && k != 0 && l != 0)                    {                          if (matrix[i + k][j + l])                          {                             if (r == -1) r = matrix[i + k][j + l];                             else { r = 0; break; }                          }                    }                }                target[i][j] = max(0, r);            }        }    }    for (i = 1; i <= n; i++)    {        for (j = 1; j <= n; j++)            printf("%d ", target[i][j]);        printf("\n");    }    return 0;}
0 0
原创粉丝点击