UVA10047独轮车
生活随笔
收集整理的這篇文章主要介紹了
UVA10047独轮车
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個獨輪車,輪子上有五個扇形,每過一個格子就轉過一個扇形,剛開始的時候方向是向北的,綠色上行向下,每一次可以有三種操作,到下一個格子,左轉90度,右轉90度,每一次操作都花費時間1,問從起點到終點的最小步數,要求到終點的時候必須還是綠色扇形向下,方向無所謂。
思路:
? ? ? mark[x][y][col][fx]代表的是在點(x,y)處,顏色是col方向是fx是否走過,然后就是個簡單的廣搜了,還有提示下,這個題目沒有必要用優先隊列的,每次操作花費都一樣,仔細想想隊列里面的東西,本來就是按照步數小的在前面存的,具體細節看代碼,還有個事就是UVA上貌似沒有pe啊!,pe貌似是直接wa的節奏。
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
? ?int x ,y ,fx ,col ,t;
}NODE;
NODE xin ,tou;
int mark[26][26][6][5];
int map[26][26];
int ex ,ey ,sx ,sy;
int n ,m;
bool ok(int x, int y ,int c ,int f)
{
? ?return x >= 1 && x <= n && y >= 1 && y <= m && !map[x][y] && !mark[x][y][c][f];
}
int BFS()
{
? ?xin.x = sx ,xin.y = sy ,xin.t = 0 ,xin.fx = 1 ,xin.col = 1;
? ?memset(mark ,0 ,sizeof(mark));
? ?mark[sx][sy][1][1] = 1;
? ?queue<NODE>q;
? ?q.push(xin);
? ?while(!q.empty())
? ?{
? ? ? tou = q.front();
? ? ? q.pop();
? ? ? if(tou.x == ex && tou.y == ey && tou.col == 1)?
? ? ? return tou.t;
? ? ??
? ? ? //向前
? ? ? if(tou.fx == 1) xin.x = tou.x - 1 ,xin.y = tou.y;
? ? ? if(tou.fx == 2) xin.x = tou.x ,xin.y = tou.y + 1;
? ? ? if(tou.fx == 3) xin.x = tou.x + 1 ,xin.y = tou.y;
? ? ? if(tou.fx == 4) xin.x = tou.x ,xin.y = tou.y - 1;
? ? ? xin.fx = tou.fx ,xin.t = tou.t + 1 ,xin.col = (tou.col + 1) % 6;
? ? ? if(!xin.col) xin.col ++;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }
? ? ? //向右
? ? ? xin.x = tou.x ,xin.y = tou.y;?
? ? ? xin.t = tou.t + 1 ,xin.col = tou.col;
? ? ? xin.fx = tou.fx + 1;
? ? ? if(xin.fx > 4) xin.fx = 1;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }?
? ? ? //向左?
? ? ? xin.x = tou.x ,xin.y = tou.y;?
? ? ? xin.t = tou.t + 1 ,xin.col = tou.col;
? ? ? xin.fx = tou.fx - 1;
? ? ? if(xin.fx == 0) xin.fx = 4;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }?
? ?}
? ?return -1;
}
int main ()
{
? ?int i ,j ,Ans ,cas = 1 ,mk = 0;
? ?char str[30];
? ?while(~scanf("%d %d" ,&n ,&m) && n + m)
? ?{
? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? {
? ? ? ? ?scanf("%s" ,str);
? ? ? ? ?for(j = 0 ;j < m ;j ++)
? ? ? ? ?{
? ? ? ? ? ? if(str[j] == '#') map[i][j+1] = 1;
? ? ? ? ? ? if(str[j] == '.') map[i][j+1] = 0;
? ? ? ? ? ? if(str[j] == 'S') map[i][j+1] = 0 ,sx = i ,sy = j + 1;
? ? ? ? ? ? if(str[j] == 'T') map[i][j+1] = 0 ,ex = i ,ey = j + 1;
? ? ? ? ?}
? ? ? }
? ? ??
? ? ? Ans = BFS(); ? ? ? ? ? ? ? ? ?
? ? ? if(mk) puts("");
? ? ? printf("Case #%d\n" ,cas ++);
? ? ? Ans == -1 ? puts("destination not reachable"):printf("minimum time = %d sec\n" ,Ans);
? ? ? mk = 1;
? ?}
? ?return 0;
}
? ? ??
? ? ? ? ?
? ? ??
? ? ??
? ? ? 給你一個獨輪車,輪子上有五個扇形,每過一個格子就轉過一個扇形,剛開始的時候方向是向北的,綠色上行向下,每一次可以有三種操作,到下一個格子,左轉90度,右轉90度,每一次操作都花費時間1,問從起點到終點的最小步數,要求到終點的時候必須還是綠色扇形向下,方向無所謂。
思路:
? ? ? mark[x][y][col][fx]代表的是在點(x,y)處,顏色是col方向是fx是否走過,然后就是個簡單的廣搜了,還有提示下,這個題目沒有必要用優先隊列的,每次操作花費都一樣,仔細想想隊列里面的東西,本來就是按照步數小的在前面存的,具體細節看代碼,還有個事就是UVA上貌似沒有pe啊!,pe貌似是直接wa的節奏。
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct
{
? ?int x ,y ,fx ,col ,t;
}NODE;
NODE xin ,tou;
int mark[26][26][6][5];
int map[26][26];
int ex ,ey ,sx ,sy;
int n ,m;
bool ok(int x, int y ,int c ,int f)
{
? ?return x >= 1 && x <= n && y >= 1 && y <= m && !map[x][y] && !mark[x][y][c][f];
}
int BFS()
{
? ?xin.x = sx ,xin.y = sy ,xin.t = 0 ,xin.fx = 1 ,xin.col = 1;
? ?memset(mark ,0 ,sizeof(mark));
? ?mark[sx][sy][1][1] = 1;
? ?queue<NODE>q;
? ?q.push(xin);
? ?while(!q.empty())
? ?{
? ? ? tou = q.front();
? ? ? q.pop();
? ? ? if(tou.x == ex && tou.y == ey && tou.col == 1)?
? ? ? return tou.t;
? ? ??
? ? ? //向前
? ? ? if(tou.fx == 1) xin.x = tou.x - 1 ,xin.y = tou.y;
? ? ? if(tou.fx == 2) xin.x = tou.x ,xin.y = tou.y + 1;
? ? ? if(tou.fx == 3) xin.x = tou.x + 1 ,xin.y = tou.y;
? ? ? if(tou.fx == 4) xin.x = tou.x ,xin.y = tou.y - 1;
? ? ? xin.fx = tou.fx ,xin.t = tou.t + 1 ,xin.col = (tou.col + 1) % 6;
? ? ? if(!xin.col) xin.col ++;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }
? ? ? //向右
? ? ? xin.x = tou.x ,xin.y = tou.y;?
? ? ? xin.t = tou.t + 1 ,xin.col = tou.col;
? ? ? xin.fx = tou.fx + 1;
? ? ? if(xin.fx > 4) xin.fx = 1;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }?
? ? ? //向左?
? ? ? xin.x = tou.x ,xin.y = tou.y;?
? ? ? xin.t = tou.t + 1 ,xin.col = tou.col;
? ? ? xin.fx = tou.fx - 1;
? ? ? if(xin.fx == 0) xin.fx = 4;
? ? ? if(ok(xin.x ,xin.y ,xin.col ,xin.fx))
? ? ? {
? ? ? ? ?mark[xin.x][xin.y][xin.col][xin.fx] = 1;
? ? ? ? ?q.push(xin);
? ? ? }?
? ?}
? ?return -1;
}
int main ()
{
? ?int i ,j ,Ans ,cas = 1 ,mk = 0;
? ?char str[30];
? ?while(~scanf("%d %d" ,&n ,&m) && n + m)
? ?{
? ? ? for(i = 1 ;i <= n ;i ++)
? ? ? {
? ? ? ? ?scanf("%s" ,str);
? ? ? ? ?for(j = 0 ;j < m ;j ++)
? ? ? ? ?{
? ? ? ? ? ? if(str[j] == '#') map[i][j+1] = 1;
? ? ? ? ? ? if(str[j] == '.') map[i][j+1] = 0;
? ? ? ? ? ? if(str[j] == 'S') map[i][j+1] = 0 ,sx = i ,sy = j + 1;
? ? ? ? ? ? if(str[j] == 'T') map[i][j+1] = 0 ,ex = i ,ey = j + 1;
? ? ? ? ?}
? ? ? }
? ? ??
? ? ? Ans = BFS(); ? ? ? ? ? ? ? ? ?
? ? ? if(mk) puts("");
? ? ? printf("Case #%d\n" ,cas ++);
? ? ? Ans == -1 ? puts("destination not reachable"):printf("minimum time = %d sec\n" ,Ans);
? ? ? mk = 1;
? ?}
? ?return 0;
}
? ? ??
? ? ? ? ?
? ? ??
? ? ??
總結
以上是生活随笔為你收集整理的UVA10047独轮车的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UVA11624大火蔓延的迷宫
- 下一篇: UVA11419 我是SAM