ZOJ 3478 SPFA
来源:互联网 发布:windows上安装apache 编辑:程序博客网 时间:2024/04/30 03:30
这题犯了两个错误:
一、题意错了。
(操控这个,另一只)=(左,右)、(右,左)、(下,下)、(上,上)
注意只有左右反了,上下并不反
二、实现问题。
判断两个(0~149的数)是否是相邻的点:
错误的代码:return (abs(now1-now2)==1||abs(now1-now2)==m);
错误提示:一个点在这行末尾,下一个点在下一行开头
正确的代码:return abs(p1/15-p2/15)+abs(p1%15-p2%15)==1;
代码写得太丑了,就不贴了。贴一下别人优美的代码:
一、题意错了。
(操控这个,另一只)=(左,右)、(右,左)、(下,下)、(上,上)
注意只有左右反了,上下并不反
二、实现问题。
判断两个(0~149的数)是否是相邻的点:
错误的代码:return (abs(now1-now2)==1||abs(now1-now2)==m);
错误提示:一个点在这行末尾,下一个点在下一行开头
正确的代码:return abs(p1/15-p2/15)+abs(p1%15-p2%15)==1;
代码写得太丑了,就不贴了。贴一下别人优美的代码:
#include<cstdio>#include<cstring>#include<string>#include <algorithm>#include <queue>using namespace std;bool minimize(int&a,int b){if(a<=b)return 0;a=b;return 1;}char maze[400];int dir[4][2]={-1,0,0,-1,1,0,0,1},rd[4]={0,3,2,1};int dp[150][150],inq[150][150],H;const int INF = 0x3f3f3f3f;int walk(int p,int d){ int x=p/15+dir[d][0],y=p%15+dir[d][1]; if(x<0||x>9||y<0||y>14||maze[x*15+y]=='X')return p; else return x*15+y;}bool neighbor(int p1,int p2){ return abs(p1/15-p2/15)+abs(p1%15-p2%15)==1;}int solve(int p1,int p2){ memset(dp,0x3f,sizeof(dp)); memset(inq,0x00,sizeof(dp)); dp[p1][p2]=0; queue<int>Q1,Q2; Q1.push(p1);Q2.push(p2); while(!Q1.empty()){ p1=Q1.front();p2=Q2.front(); Q1.pop();Q2.pop(); inq[p1][p2]=false; if(maze[p1]=='O'&&maze[p2]=='O')continue; if(maze[p1]=='O'){ if(neighbor(p1,p2)){ if(minimize(dp[p2][p2],dp[p1][p2]+11)&&!inq[p2][p2]){ Q1.push(p2);Q2.push(p2);inq[p2][p2]=1; } } for(int d=0;d<4;++d){ int np=walk(p2,d); if(minimize(dp[p1][np],dp[p1][p2]+3)&&!inq[p1][np]){ Q1.push(p1);Q2.push(np);inq[p1][np]=1; } } } else if(maze[p2]=='O'){ if(neighbor(p1,p2)){ if(minimize(dp[p1][p1],dp[p1][p2]+11)&&!inq[p1][p1]){ Q1.push(p1);Q2.push(p1);inq[p1][p1]=1; } } for(int d=0;d<4;++d){ int np=walk(p1,d); if(minimize(dp[np][p2],dp[p1][p2]+2)&&!inq[np][p2]){ Q1.push(np);Q2.push(p2);inq[np][p2]=1; } } } else{ for(int d=0;d<4;++d){ int np1=walk(p1,d),np2=walk(p2,rd[d]); if(minimize(dp[np1][np2],dp[p1][p2]+5)&&!inq[np1][np2]){ Q1.push(np1);Q2.push(np2);inq[np1][np2]=1; } } } } return dp[H][H];}int main(){ int T; scanf("%d", &T); while(T--) { int s1,e1,s2,e2; for(int i=0;i<150;++i){ scanf(" %c",&maze[i]); if(maze[i]=='H')H=i; } scanf("%d%d%d%d",&s1,&e1,&s2,&e2); int p1=s1*15+e1-16,p2=s2*15+e2-16; int ans=min(solve(p1,p2),solve(p2,p1)); if(ans==INF)ans=-1; printf("%d\n",ans); } return 0;}
- ZOJ 3478 SPFA
- zoj 3794 spfa
- ZOJ 1333 Galactic Import 【SPFA】
- ZOJ 1952 Heavy Cargo【SPFA】
- zoj 3103 Cliff Climbing (SPFA)
- ZOJ 3794 Greedy Driver spfa
- zoj 3088 Easter Holidays (spfa)
- ZOJ 3946Highway Project【spfa】
- ZOJ 3946 Highway Project (spfa)
- ZOJ Problem 3946 (SPFA)
- zoj 1082 Stockbroker Grapevine( 重写 SPFA!)
- ZOJ 1857 && POJ 2607 Fire Station【SPFA】
- POJ 1932 XYZZY (ZOJ 1935)SPFA+floyd
- ZOJ 3080 ChiBi(SPFA,并查集)
- zoj 3088 spfa 最短&最长路径
- zoj 3088 Easter Holidays (spfa )
- zoj 3103 Cliff Climbing(spfa )
- zoj 3847 Collect Chars(ac自动机 + spfa)
- MFC dll注入框架
- 今天遇到了一个非常恶心的错误
- 数据库层
- configure编译中常见的错误
- C++学习书籍
- ZOJ 3478 SPFA
- 查找之杨氏矩阵
- 外企那些事儿
- Euclid's Game
- 黑马程序员-我的摘录-正则表达式总结-需要加强
- [Android]反编译工具:apktool、dex2jar、jd-gui使用简介
- 第一讲.Liner_Regression and Gradient_Descent(Rui Xia) 单变量线性回归及梯度下降
- hdu4092 计算几何趣味打表题
- poj 2243(A*搜索orBFS)