poj 1024(bfs的扩展,最短路径不唯一的判定,围墙围住封闭空间的判定)
#include<iostream> #include<cstring> using namespace std; #define maxn 105 int m,n,w_num,path_num; typedef struct node{ int x1,y1,x2,y2; }Wall; Wall wall[maxn*maxn]; int dis_s[maxn][maxn],dis_e[maxn][maxn]; void bfs(int x1,int y1,int dis[][maxn]){ bool vis_bfs[maxn][maxn] = {false},isgo; int dx[] = {0,1,0,-1}; int dy[] = {1,0,-1,0}; vis_bfs[x1][y1] = true; int head = 0,tail = 0; int Qx[maxn*maxn],Qy[maxn*maxn]; Qx[tail] = x1;Qy[tail] = y1;tail++; while(head<tail){ int x = Qx[head]; int y = Qy[head]; head++; for(int i=0;i<4;i++){ int px = x+dx[i]; int py = y+dy[i]; if(vis_bfs[px][py]||px<0||py<0||px>=m||py>=n){ continue; } isgo = true; for(int j=0;j<w_num;j++){ int x1 = wall[j].x1,y1 = wall[j].y1; int x2 = wall[j].x2,y2 = wall[j].y2; if((px==x1&&py==y1&&x==x2&&y==y2) ||(px==x2&&py==y2&&x==x1&&y==y1)){ isgo = false; break; } } if(!isgo)continue; dis[px][py] = dis[x][y]+1; vis_bfs[px][py] = true; Qx[tail] = px; Qy[tail] = py; tail++; } } } int main(){ int cnt,endx,endy; char c; bool fail,vis[maxn][maxn]; scanf("%d",&cnt); while(cnt--){ path_num = endx = endy = 0; memset(vis,false,sizeof(vis)); vis[0][0] = true; scanf("%d%d\n",&m,&n); while(c=getchar(),c!='\n'){ switch(c){ case 'R':endx++;break; case 'L':endx--;break; case 'U':endy++;break; case 'D':endy--;break; } path_num++; vis[endx][endy] = true; } scanf("%d",&w_num); for(int i=0;i<w_num;i++){ int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); wall[i].x1 = x1; wall[i].y1 = y1; wall[i].x2 = x2; wall[i].y2 = y2; } memset(dis_s,0,sizeof(dis_s)); memset(dis_e,0,sizeof(dis_e)); bfs(0,0,dis_s); bfs(endx,endy,dis_e); // cout<<endx<<" "<<endy<<endl; // for(int j=n-1;j>-1;j--){ // for(int i=0;i<m;i++){ // printf("%3d",dis_e[i][j]); // } // cout<<endl; // } // cout<<endl; fail = false; for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(!vis[i][j]&&dis_s[i][j]+dis_e[i][j]==path_num){ fail = true; break; } } if(fail)break; } if(fail){ printf("INCORRECT\n"); continue; } fail = false; for(int i=0;i<w_num;i++){ int x1 = wall[i].x1; int y1 = wall[i].y1; int x2 = wall[i].x2; int y2 = wall[i].y2; if((dis_s[x1][y1]+dis_e[x2][y2]>path_num &&dis_s[x2][y2]+dis_e[x1][y1]>path_num) ||(dis_s[x1][y1]==0&&dis_e[x1][y1]==0) ||(dis_s[x2][y2]==0&&dis_e[x2][y2]==0)){ fail = true; break; } } if(fail){ printf("INCORRECT\n"); continue; } printf("CORRECT\n"); } return 0; }
分类:
POJ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)