HDU-5433
2016-07-29 16:37
288 查看
思路:BFS+优先队列,用一个50*50*50的double数组判重。
注意!!!
题目里的x和y是反着的,也就是说,x对应n,y对应m。
例: n = 3,m = 6 时地图为:
**?***
******
******
“?”为(x=1,y=3)
浪费了一下午的时间。。。
#include <iostream>
#include <iomanip>
#include <queue>
using namespace std;
double ABS(double a){
return a>0?a:(a*-1);
}
struct node{
int x,y,k;
double cost;
bool operator < (const node &a) const{
if(ABS(cost-a.cost)<0.0000001) return k>a.k;
else return cost>a.cost;
}
};
int n,m,k,sx,sy,ex,ey;
int value[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char map[55][55];
double flag[55][55][55];
int ABS(int a){
return a>0?a:(a*-1);
}
double BFS(){
priority_queue<node> q;
node temp1,temp2;
temp1.x = sx;
temp1.y = sy;
temp1.k = 0;
temp1.cost = 0;
q.push(temp1);
while(!q.empty()){
temp1 = q.top();
q.pop();
if(temp1.x == ex && temp1.y == ey) return temp1.cost;
for(int i=0;i<4;i++){
temp2.x = temp1.x + value[i][0];
temp2.y = temp1.y + value[i][1];
temp2.k = temp1.k+1;
if(temp2.k>=k) continue;
if(temp2.x>=0 && temp2.x<n && temp2.y>=0 && temp2.y<m && map[temp2.x][temp2.y]!='#'){
temp2.cost = temp1.cost+(double)ABS(int(map[temp2.x][temp2.y])-int(map[temp1.x][temp1.y]))/double(k-temp2.k+1);
if(flag[temp2.x][temp2.y][temp2.k]>temp2.cost){
flag[temp2.x][temp2.y][temp2.k] = temp2.cost;
q.push(temp2);
}
}
}
}
return -10;
}
int main(){
int t,i;
double temp;
cin>>t;
while(t--){
cin>>n>>m>>k;
for(i=0;i<n;i++) cin>>map[i];
cin>>sx>>sy>>ex>>ey;
if(k == 0){
cout<<"No Answer"<<endl;
continue;
}
sx--;
sy--;
ex--;
ey--;
for(i=0;i<=n;i++){
for(int j=0;j<=m;j++){
for(int l=0;l<=k;l++) flag[i][j][l] = 999999999;
}
}
temp = BFS();
if(temp<-1) cout<<"No Answer"<<endl;
else cout<<fixed<<setprecision(2)<<temp<<endl;
}
return 0;
}
注意!!!
题目里的x和y是反着的,也就是说,x对应n,y对应m。
例: n = 3,m = 6 时地图为:
**?***
******
******
“?”为(x=1,y=3)
浪费了一下午的时间。。。
#include <iostream>
#include <iomanip>
#include <queue>
using namespace std;
double ABS(double a){
return a>0?a:(a*-1);
}
struct node{
int x,y,k;
double cost;
bool operator < (const node &a) const{
if(ABS(cost-a.cost)<0.0000001) return k>a.k;
else return cost>a.cost;
}
};
int n,m,k,sx,sy,ex,ey;
int value[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
char map[55][55];
double flag[55][55][55];
int ABS(int a){
return a>0?a:(a*-1);
}
double BFS(){
priority_queue<node> q;
node temp1,temp2;
temp1.x = sx;
temp1.y = sy;
temp1.k = 0;
temp1.cost = 0;
q.push(temp1);
while(!q.empty()){
temp1 = q.top();
q.pop();
if(temp1.x == ex && temp1.y == ey) return temp1.cost;
for(int i=0;i<4;i++){
temp2.x = temp1.x + value[i][0];
temp2.y = temp1.y + value[i][1];
temp2.k = temp1.k+1;
if(temp2.k>=k) continue;
if(temp2.x>=0 && temp2.x<n && temp2.y>=0 && temp2.y<m && map[temp2.x][temp2.y]!='#'){
temp2.cost = temp1.cost+(double)ABS(int(map[temp2.x][temp2.y])-int(map[temp1.x][temp1.y]))/double(k-temp2.k+1);
if(flag[temp2.x][temp2.y][temp2.k]>temp2.cost){
flag[temp2.x][temp2.y][temp2.k] = temp2.cost;
q.push(temp2);
}
}
}
}
return -10;
}
int main(){
int t,i;
double temp;
cin>>t;
while(t--){
cin>>n>>m>>k;
for(i=0;i<n;i++) cin>>map[i];
cin>>sx>>sy>>ex>>ey;
if(k == 0){
cout<<"No Answer"<<endl;
continue;
}
sx--;
sy--;
ex--;
ey--;
for(i=0;i<=n;i++){
for(int j=0;j<=m;j++){
for(int l=0;l<=k;l++) flag[i][j][l] = 999999999;
}
}
temp = BFS();
if(temp<-1) cout<<"No Answer"<<endl;
else cout<<fixed<<setprecision(2)<<temp<<endl;
}
return 0;
}
相关文章推荐
- Quartz-JobDetail和Trigger-Job
- 如何快速低成本搭建 DA14580/DA1458x 软硬件开发平台open-ble.org
- Fiddler调试工具使用教程
- HDU 1849-Rabbit and Grass(尼姆博弈)
- [oracle] 解决ORA-30036:无法按8扩展段(在还原表空间‘XXXX’中)
- Oracle数据库,忽略大小写Like模糊查询(SQL Server,MySql原理相同)
- 杭电2030解题代码
- Letter Combinations of a Phone Number
- 从while(scanf() != EOF)说到ACM OnlineJuge的评判原理
- [完全背包]Tyvj1199 邮票问题
- 如何快速转载CSDN中的博客
- HDU5773 The All-purpose Zero
- OC 分类
- 操作系统:死锁 //程序耦合性
- 二叉查找树(二叉排序树)BST解析
- DP问题各种模型的状态转移方程
- Java版本:识别Json字符串并分隔成Map集合
- 直播造轮子-分页
- iOS 下ARC的内存管理机制
- jsp学习(五)