zoukankan      html  css  js  c++  java
  • poj-1024(唯一最短路径)(转)

    题意:

    /**
    * (1)求各点到源点的最小步数(DFS)
    * (2)求各点到终点的最小步数(DFS)
    * (3)如果点不是给定路径上的点,那么:该点到源点的最小步数+该点到终点的最小步数<=给定路径的步数,否则给定路径不是唯一最短的
    * (4)如果两相邻点a、b之间存在墙,那么:a到源点的最小步数+1+b到终点的最小步数<=给定路径的步数
    *                               或者 a到终点的最小步数+1+b到源点的最小步数<=给定路径的步数,否则墙多余
    * (5)如果存在点不可达,说明存在墙将该点封闭起来,可以证明墙至少有一块多余 (本程序未考虑这一点,也过了)*/

    #include <stdio.h>
    #include <string.h>
    struct pos
    {
    int len[2];
    int used;
    int r;
    int u;
    }p[20][20];
    int num, wallNum, w, h, Dx, Dy, minPath;
    void DFS(int x, int y, int len, int flag)
    {
    if (len >= p[x][y].len[flag] && p[x][y].len[flag]!=0)
       return;
    if (x+y!=0 && (x!=Dx||y!=Dy))
       p[x][y].len[flag] = len;
    len++;
    if (p[x][y].r==0 && x+1<w)
       DFS(x+1, y, len, flag);
    if (p[x][y].u==0 && y+1<h)
       DFS(x, y+1, len, flag);
    if (x-1>=0 && p[x-1][y].r==0)
       DFS(x-1, y, len, flag);
    if (y-1>=0 && p[x][y-1].u==0)
       DFS(x, y-1, len, flag);
    } 
    int judge()
    {
    int i, j;
    for (i=0; i<w; i++)
       for (j=0; j<h; j++)
       {
        if (p[i][j].used==0 && p[i][j].len[0]+p[i][j].len[1]<=minPath)
         return 0;
        if (p[i][j].r==1 && i+1<w && p[i][j].len[0]+p[i+1][j].len[1]+1>minPath && p[i][j].len[1]+p[i+1][j].len[0]+1>minPath)
         return 0;
        if (p[i][j].u==1 && j+1<h && p[i][j].len[0]+p[i][j+1].len[1]+1>minPath && p[i][j].len[1]+p[i][j+1].len[0]+1>minPath)
         return 0; 
       }
    return 1;
    }
    int main()
    {
    int x, y, x1, y1, x2, y2;
    char c;
    scanf("%d", &num);
    while (num--)
    { 
       memset(p, 0, sizeof(p));
       scanf("%d %d
    ", &w, &h);
       p[0][0].used = 1;
       Dx = Dy = minPath = 0;
       while ((c=getchar())!='
    ' && c!=EOF)
       {
        if (c == 'U')
         p[Dx][++Dy].used = 1;
        else if (c == 'D')
         p[Dx][--Dy].used = 1;
        else if (c == 'L')
         p[--Dx][Dy].used = 1;
        else if (c == 'R')
         p[++Dx][Dy].used = 1;
        minPath++;
       }
       scanf("%d", &wallNum);
       while (wallNum--)
       {
        scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
        x = x1 - x2;
        y = y1 - y2;
        if (x==0 && y==1)
         p[x2][y2].u = 1;
        else if (x==0 && y==-1)
         p[x1][y1].u = 1;
        else if (x==1 && y==0)
         p[x2][y2].r = 1;
        else if (x==-1 && y==0)
         p[x1][y1].r = 1;
       }
       DFS(0, 0, 0, 0);
       DFS(Dx, Dy, 0, 1); 
       if(judge())
        printf("CORRECT
    ");
       else
        printf("INCORRECT
    ");
    }
    return 0;
    }
    View Code
  • 相关阅读:
    悬崖边上的舞者,记7.2生产数据库灾难事件
    MySQL数据库辅助类
    C# 自定义控件VS用户控件
    WinForm创建自定义控件
    mvc导出excel
    aspose导出excel文件
    oracle 定义带参数的视图
    extjs 分组函数自定义统计
    向第三次世界大战中的勇士致敬
    Office2007打开文件提示“您尝试打开的文件xxx.xls的格式与文件扩展名指定的格式不一致”的解决办法
  • 原文地址:https://www.cnblogs.com/baoluqi/p/3741345.html
Copyright © 2011-2022 走看看