程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu 3345 (BFS)

hdu 3345 (BFS)

編輯:C++入門知識

/*

 

 

 

剛開始沒用二維數組存每次更新出來的最大的mv值,後來看階梯報告才發現可以這樣做啊。。。。

需要注意一下,
當你遇到E時,只有當v值>0時,才讓v=0;
即v=0時,v=0;
否則不用;
這裡有點坑


2013/04/22-13:25

 


*/

 

 

 


[cpp]
#include"stdio.h"  
#include"string.h"  
#include"queue"  
#define N 111  
using namespace std; 
 
char map[N][N],ans[N][N]; 
//map--原始串,ans---更新的串  
int dir[4][2]={1,0,0,1,-1,0,0,-1}; 
int n,m,mv; 
int X,Y; 
int dp[N][N]; 
//dp[x][y]--存x,y位置的最大mv值  
struct node 

    int x,y,v; 
}p,q; 
 
queue<node>Q; 
//判斷函數  
int judge(int x,int y) 

    if(x>=0&&x<n&&y>=0&&y<m)return 1; 
    return 0; 

//對v處理  
int fun(int x,int y,int v) 

    int i; 
    int xx,yy,vv; 
    if(map[x][y]=='T')vv=v-2; 
    else if(map[x][y]=='R')vv=v-3; 
    else vv=v-1; 
    for(i=0;i<4;i++) 
    { 
        xx=x+dir[i][0]; 
        yy=y+dir[i][1]; 
        if(judge(xx,yy)&&map[xx][yy]=='E') 
            /*這裡需要注意一下,
            當你遇到E時,只有當v值>0時,才讓v=0;
            即v=0時,v=0;
            否則不用;
            這裡有點坑
              */ 
            return vv>0?0:vv; 
    } 
    return vv; 

void bfs() 

    int i; 
    p.x=X; 
    p.y=Y; 
    p.v=mv; 
    Q.push(p); 
    dp[X][Y]=mv; 
    ans[X][Y]='Y'; 
    while(!Q.empty()) 
    { 
        p=Q.front(); 
        Q.pop(); 
        if(p.v==0)continue; 
        for(i=0;i<4;i++) 
        { 
            q.x=p.x+dir[i][0]; 
            q.y=p.y+dir[i][1]; 
            q.v=p.v; 
            if(!judge(q.x,q.y))continue; 
            if(map[q.x][q.y]=='Y' 
                ||map[q.x][q.y]=='E'||map[q.x][q.y]=='#')continue; 
            q.v=fun(q.x,q.y,q.v); 
            if(q.v<0)continue; 
            if(q.v>dp[q.x][q.y]) 
            { 
                dp[q.x][q.y]=q.v; 
                Q.push(q); 
                if(map[q.x][q.y]!='P') 
                    ans[q.x][q.y]='*'; 
            } 
        } 
    } 

         
 
int main() 

    int T,i,j; 
    scanf("%d",&T); 
    while(T--) 
    { 
        scanf("%d%d%d",&n,&m,&mv); 
        getchar(); 
        memset(dp,-1,sizeof(dp)); 
        for(i=0;i<n;i++) 
        { 
            gets(map[i]); 
            for(j=0;map[i][j];j++) 
            { 
                if(map[i][j]=='Y') 
                { 
                    X=i;Y=j; 
                } 
                ans[i][j]=map[i][j]; 
            } 
            ans[i][m]='\0'; 
        } 
        bfs(); 
        for(i=0;i<n;i++) 
            puts(ans[i]); 
        printf("\n"); 
    } 
    return 0; 

#include"stdio.h"
#include"string.h"
#include"queue"
#define N 111
using namespace std;

char map[N][N],ans[N][N];
//map--原始串,ans---更新的串
int dir[4][2]={1,0,0,1,-1,0,0,-1};
int n,m,mv;
int X,Y;
int dp[N][N];
//dp[x][y]--存x,y位置的最大mv值
struct node
{
 int x,y,v;
}p,q;

queue<node>Q;
//判斷函數
int judge(int x,int y)
{
 if(x>=0&&x<n&&y>=0&&y<m)return 1;
 return 0;
}
//對v處理
int fun(int x,int y,int v)
{
 int i;
 int xx,yy,vv;
 if(map[x][y]=='T')vv=v-2;
 else if(map[x][y]=='R')vv=v-3;
 else vv=v-1;
 for(i=0;i<4;i++)
 {
  xx=x+dir[i][0];
  yy=y+dir[i][1];
  if(judge(xx,yy)&&map[xx][yy]=='E')
   /*這裡需要注意一下,
   當你遇到E時,只有當v值>0時,才讓v=0;
   即v=0時,v=0;
   否則不用;
   這裡有點坑
     */
   return vv>0?0:vv;
 }
 return vv;
}
void bfs()
{
 int i;
 p.x=X;
 p.y=Y;
 p.v=mv;
 Q.push(p);
 dp[X][Y]=mv;
 ans[X][Y]='Y';
 while(!Q.empty())
 {
  p=Q.front();
  Q.pop();
  if(p.v==0)continue;
  for(i=0;i<4;i++)
  {
   q.x=p.x+dir[i][0];
   q.y=p.y+dir[i][1];
   q.v=p.v;
   if(!judge(q.x,q.y))continue;
   if(map[q.x][q.y]=='Y'
    ||map[q.x][q.y]=='E'||map[q.x][q.y]=='#')continue;
   q.v=fun(q.x,q.y,q.v);
   if(q.v<0)continue;
   if(q.v>dp[q.x][q.y])
   {
    dp[q.x][q.y]=q.v;
    Q.push(q);
    if(map[q.x][q.y]!='P')
     ans[q.x][q.y]='*';
   }
  }
 }
}
  

int main()
{
 int T,i,j;
 scanf("%d",&T);
 while(T--)
 {
  scanf("%d%d%d",&n,&m,&mv);
  getchar();
  memset(dp,-1,sizeof(dp));
  for(i=0;i<n;i++)
  {
   gets(map[i]);
   for(j=0;map[i][j];j++)
   {
    if(map[i][j]=='Y')
    {
     X=i;Y=j;
    }
    ans[i][j]=map[i][j];
   }
   ans[i][m]='\0';
  }
  bfs();
  for(i=0;i<n;i++)
   puts(ans[i]);
  printf("\n");
 }
 return 0;
}


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved