HD200703

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,startx,starty,finx,finy,f[35][35],a[2005],b[2005],c[2005],d[2005],v[2005],dis[35][35];
int main()
{
    int i,j,k=1;
    scanf("%d%d%d%d%d",&n,&startx,&starty,&finx,&finy);
    memset(dis,88,sizeof(dis));
    dis[startx][starty]=0;
    int l=n*n;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            scanf("%d",&f[i][j]);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            if(i==n)
            {
                if(j==n) break;
                a[k]=i;
                b[k]=j;
                c[k]=i;
                d[k]=j+1;
                v[k++]=f[i][j+1];
            }
            else
            {
                if(j==n)
                {
                    a[k]=i;
                    b[k]=j;
                    c[k]=i+1;
                    d[k]=j;
                    v[k++]=f[i+1][j];
                    continue;
                }
                else
                {
                    a[k]=i;
                    b[k]=j;
                    c[k]=i;
                    d[k]=j+1;
                    v[k++]=f[i][j+1];
                    a[k]=i;
                    b[k]=j;
                    c[k]=i+1;
                    d[k]=j;
                    v[k++]=f[i+1][j];
                    continue;
                }
            }
        }
    }
    k--;
    for(i=k+1;i<=k*2;i++)
    {
        a[i]=c[i-k];
        b[i]=d[i-k];
        c[i]=a[i-k];
        d[i]=b[i-k];
        v[i]=f[c[i]][d[i]];
    }
    k*=2;
    //for(i=1;i<=k;i++) printf("%d %d %d %d %d
",a[i],b[i],c[i],d[i],v[i]); printf("%d",k);
    for(i=1;i<l;i++)
    {
        int check=0;
        for(j=1;j<=k;j++)
        {
            if(dis[c[j]][d[j]]>dis[a[j]][b[j]]+v[j])
            {
                dis[c[j]][d[j]]=dis[a[j]][b[j]]+v[j];
                check=1;
            }
        }
        if(check==0) break;
    }
    /*
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            printf("%d ",dis[i][j]);
        printf("
");
    }
    */
    printf("%d",dis[finx][finy]+f[startx][starty]);
    return 0;
}
HD200703排雷
难度级别:B;            运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
试题描述
一片战场被划分为N行N列小区域,敌我双方各占据其中一个小区域。
根据侦察,敌人派出工兵潜入各区域(包括我方和敌方所在区域)布设了地雷。
现我方侦察兵已经掌握了各片区域的地雷数量。为偷袭敌人,需要寻找一条从我方区域通向敌方区域并且地雷总数最少的路径,执行偷袭任务时,此路净上的地雷都需要排除。
请你编一个名为MIN的程序,计算出偷袭路径最少需要排雷多少个。
说明:排雷总数包括我方和敌方所在区域的地雷数。偷袭路径是由一个个区域连接而成,每个区域只能通向上、下、左、右的4个相邻区域。
输入
输入第一行只有一个数N,表示每行每列区域个数。1<N<30。 第二行两个数表示我方区域所在的行和列。第三行两个数表示敌方区域所在的行和列。这四个数均为不超过N的正整数。 接下去的N行中,每行有N个数,表示整个战场的地雷分布。每个区域的地雷数均是小于10000的非负整数。
输出
输出中只有一个数,即最小排雷数。
输入示例
4 2 1 3 3 1 1 1 1 2 9 8 3 8 9 4 2 1 2 3 4
输出示例
15

 为什么WA!!!

原文地址:https://www.cnblogs.com/llllllpppppp/p/7718464.html