poj-1024(唯一最短路径)(转)
来源:互联网 发布:android基站定位源码 编辑:程序博客网 时间:2024/04/27 22:26
题意:View Code
/**
* (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\n", &w, &h); p[0][0].used = 1; Dx = Dy = minPath = 0; while ((c=getchar())!='\n' && 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\n"); else printf("INCORRECT\n");}return 0;}
0 0
- poj-1024(唯一最短路径)(转)
- POJ 最短路径
- 最短路径-Dijkstra(poj 1135)
- poj 2240 Arbitrage(最短路径)
- poj 1847 Tram(最短路径)
- poj--1062(最短路径+枚举)
- POJ 3259(最短路径)
- poj 最短路径 汇总
- POJ 3259 最短路径
- poj 1125 最短路径
- 【最短路径】poj 2387
- 【最短路径】poj 1062
- 最短路径__Wormholes( Poj )
- 最短路径__Candies ( Poj )
- poj 2253(最短路径)
- 最短路径-POJ-2387
- POJ 2139-- 最短路径 (floyd算法,任意两点间的最短路径)
- POJ 1062昂贵的聘礼(最短路径.Dijkstra)
- poj-2312
- poj-1010(转)
- poj-1011
- poj-1020(填蛋糕)(转)
- poj-1022(四维模仿)(转)
- poj-1024(唯一最短路径)(转)
- poj-1069(三角形和六边形)(转)
- Spark技术实战之1--KafkaWordCount
- hdu-(1298手机相关 dfs+字典树)
- 枚举(黑白棋)
- POJ3253-Fence Repair-贪心-哈夫曼树
- 自制FFmpeg SDK并使用output_example测试
- Android:如何设计一个完全不可见的Activity?
- 枚举(+-)