1. 程式人生 > >仙島求藥

仙島求藥

0kb step 長度 時間限制 代碼 是否 tput stream mina

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
char map[101][101];
int step=9999999;
int yaox[10010],yaoy[10010],book[101][101],n,m;
int road(int a,int b,int x,int y)
{
    return abs(x-a)+abs(y-b);//A* 橫豎的大概路徑,方便減少路徑數,優化時間
} int bfs(int a,int b,int x,int y) { memset(book,0,sizeof(book)); int nx,ny; queue <int> Qx;//存橫豎坐標 queue <int> Qy; Qx.push(a);//當前點坐標進隊 Qy.push(b); while(!Qx.empty())//隊不為空 { nx=Qx.front(),ny=Qy.front();//隊首元素 if(nx==x&&ny==y)//到達終點 {
return book[nx][ny]; } Qx.pop(); Qy.pop(); if(book[nx-1][ny]==0 && map[nx-1][ny]!=# && nx>0)//判斷是否走過,是否能走,是否出界 { Qx.push(nx-1); Qy.push(ny); book[nx-1][ny]=book[nx][ny]+1;//步數加一 } if(book[nx+1][ny]==0
&& map[nx+1][ny]!=# && nx<=n) { Qx.push(nx+1); Qy.push(ny); book[nx+1][ny]=book[nx][ny]+1; } if(book[nx][ny-1]==0 && map[nx][ny-1]!=# && ny>0) { Qx.push(nx); Qy.push(ny-1); book[nx][ny-1]=book[nx][ny]+1; } if(book[nx][ny+1]==0 && map[nx][ny+1]!=# && ny<=m) { Qx.push(nx); Qy.push(ny+1);; book[nx][ny+1]=book[nx][ny]+1; } } return 0; } int main() { while(cin>>n>>m) { int i,j,k=1,x,y,s1,s2; if(n==0&&m==0) { break; } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>map[i][j]; if(map[i][j]==@)//李逍遙坐標 { x=i; y=j; } if(map[i][j]==s)//嬸嬸坐標 { s1=i; s2=j; } } } int minans=99999999; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(map[i][j]==*)//有藥 { int yao; yao=road(i,j,x,y); yao+=road(i,j,s1,s2); if(yao<minans) { int s=0; s+=bfs(x,y,i,j); s+=bfs(i,j,s1,s2); if(s<minans) minans=s;//更新最大值 } } } } cout<<minans<<endl; } //system("puase"); return 0; }


下面有題目,主要是一個深搜,用了A*算法,求出每條路的大概值,找最優解。(比較到一個藥再到終點的直線距離是否比上到一個藥到終點的實際距離要長,長的話直接舍去,短的話再求實際距離。)

仙島求藥(二)
難度級別:C; 運行時間限制:1000ms; 運行空間限制:256000KB; 代碼長度限制:2000000B
試題描述
咳,上回說到李逍遙去求藥,其實他找到藥之後,還需要給他的嬸嬸送過去,所以他需要在最短的時間內找到要並且到達嬸嬸(‘s‘)所在的位置。
輸入
輸入有多組測試數據. 每組測試數據以兩個非零整數 M 和 N 開始,兩者均不大於100。M 表示迷陣行數, N 表示迷陣列數。接下來有 M 行, 每行包含N個字符,不同字符分別代表不同含義:
1) [email protected]:少年李逍遙所在的位置;
2) ‘.’:可以安全通行的方格;
3) ‘#’:有怪物的方格;
4) ‘*’:仙藥所在位置。
5) ‘s‘ : 嬸嬸所在的位置。
當在一行中讀入的是兩個零時,表示輸入結束。
輸出
對於每組測試數據,分別輸出一行,該行包含李逍遙找到仙藥並且送給嬸嬸需要穿過的最少的方格數目(計數包括初始位置的方塊)。如果他不可能找到仙藥, 則輸出 -1。
輸入示例
8 8
.@##...#
#....#.#
#.#.##..
*.#.###.
#.#...#.
..###*#.
...#.s..
.#.*.###
0 0
輸出示例
10
其他說明
仙藥的數量沒有上限,所以最多有M*N-2個仙藥哦~

仙島求藥