Nightmare hdu 1072 bfs (可以往回走的bfs,hash有點帥)

來源:互聯網
上載者:User

/*<br />看來是真的很水,以前寫過的題目在寫的話TLE<br />只記得hash 裡面要弄個6, 以前會AC,但不代表你現在會<br />這個hash[sx][sy] = 6 真的是一個很好的方法<br />*/#include <iostream><br />#include <cstdio><br />#include <cstring><br />#include <queue><br />using namespace std;<br />const int N = 12;<br />int hash[N][N];<br />int map[N][N];<br />struct node<br />{<br />int x, y, step;<br />node (){};<br />node (int xx, int yy, int st): x(xx), y(yy), step(st){};<br />};<br />int dx[] = {0, 0, 1, -1};<br />int dy[] = {1, -1, 0, 0};<br />int n, m;<br />void BFS(int sx, int sy, int ex, int ey)<br />{<br />node now, next;<br />queue<node> Q;<br />Q.push(node(sx, sy, 0));<br />hash[sx][sy] = 6; // 起點時間為6<br />while(!Q.empty())<br />{<br />now = Q.front();<br />Q.pop();<br />for(int i = 0; i < 4; i++)<br />{<br />next = now;<br />next.x = now.x + dx[i];<br />next.y = now.y + dy[i];<br />if(next.x < 0 || next.x >= n || next.y < 0 || next.y >= m || hash[now.x][now.y] <= 1 || map[next.x][next.y] == 0)<br />continue;<br />next.step = now.step + 1;<br />if(map[next.x][next.y] == 3)<br />{<br />printf("%d/n", next.step);<br />return ;<br />}<br />if(hash[next.x][next.y] < hash[now.x][now.y] - 1)<br />{ // next點離爆炸的時間比 now的爆炸的時間短的話才入隊列<br />hash[next.x][next.y] = hash[now.x][now.y] - 1;<br />if(map[next.x][next.y] == 4)<br />{<br />hash[next.x][next.y] = 6;<br />//next.time = 6;<br />}<br />Q.push(next);<br />}</p><p>}<br />}<br />printf("-1/n");<br />return ;<br />}<br />int main()<br />{<br />//freopen("hxsh.in", "r", stdin); // 建一個這樣的檔案,就不要整天複製了<br />int t;<br />scanf("%d", &t);<br />while(t--)<br />{<br />scanf("%d %d", &n, &m);<br />int sx, sy, ex, ey;<br />for(int i = 0; i < n; i++)<br />for(int j = 0; j < m; j++)<br />{<br />hash[i][j] = 0;<br />scanf("%d", &map[i][j]);<br />if(map[i][j] == 2)<br />{<br />sx = i;<br />sy = j;<br />}<br />if(map[i][j] == 3)<br />{<br />ex = i;<br />ey = j;<br />}<br />}<br />BFS(sx, sy, ex, ey);<br />}<br />} 

/*
   方法借鑒了hdOj論壇,沒有處理過可以往回走的題目,所以處理起來很棘手,
   第一次爆記憶體了,對於輸出是-1的情況的,我起初考慮的是有點問題的,但是不知怎麼解決
   後來看了論壇,想想應該是自己的代碼造成死迴圈的緣故吧。
   bfs的變形真的讓人有點那個的。。
*/
#include<iostream>//2399633 2010-04-29 19:31:23 Accepted 1072 0MS 292K 1915 B C++ 悔惜晟
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;

int si, sj;
int ei, ej;
int num;
int n, m;
char map[10][10];
int  hash[10][10];//這個hash 有點帥。。。
int dir[4][2] = { {1, 0}, {-1, 0}, {0, 1}, {0, -1} };
struct node
{
 int time;
 int x;
 int y;
 //int count;
};

int bfs(int sx, int sy)
{
 node N, P;
 int i;
 queue<node>q;
 N.x = sx;
 N.y = sy;
 N.time = 0;
 hash[N.x][N.y] = 6;//完美的處理
 //N.count = 6;
 q.push(N);
 while(!q.empty())
 {
  N = q.front();
  /*
  if(N.x == ei && N.y == ej && hash[N.x][N.y] > 0)
  {
   printf("%d/n", N.time);
   return 1;
  }
  */
  /*
  if(N.time >= num)
  {
   break;
  }
  */
  q.pop();
  for(i = 0; i < 4; i++)
  {
   P.x = N.x + dir[i][0];
   P.y = N.y + dir[i][1];
   //P.count = N.count - 1;
   P.time = N.time + 1;
   if(hash[N.x][N.y] <= 1 || P.x < 0 || P.x >= n || P.y < 0 || P.y >= m || map[P.x][P.y] == '0')
    continue;
   /*
   if(map[P.x][P.y] == '1' || map[P.x][P.y] == '3')
   {
    q.push(P);
    if(hash[P.x][P.y] < hash[N.x][N.y] - 1)
        hash[P.x][P.y] = hash[N.x][N.y] - 1;
     
   }
   */
   if(map[P.x][P.y] == '3')
   {
    printf("%d/n", P.time);
    return 1;
   }
   if(hash[P.x][P.y] < hash[N.x][N.y] - 1)
   {
    hash[P.x][P.y] = hash[N.x][N.y] - 1;
    if(map[P.x][P.y] == '4')
    {
     //P.count = 6;
     hash[P.x][P.y] = 6;
     //q.push(P);
    }
    q.push(P);
   }

  }

 }
 printf("-1/n");
 return 1;

}

int main()
{
 int T;
 int i, j;
 cin>>T;
 while(T--)
 {
  cin>>n>>m;
  for(i = 0; i < n; i++)
  for(j = 0 ; j <m; j++)
  {
   cin>>map[i][j];
   //hash[i][j] = 6;
   if(map[i][j] == '2')
   {
    si = i;
    sj = j;
   }
   if(map[i][j] == '3')//沒有用的
   {
    ei = i;
    ej = j;
   }
  }
  //num =2 * (int)(abs(1.0 * si - ei) +abs(1.0 * sj - ej));
  memset(hash, -1, sizeof(hash));
  bfs(si, sj);
 }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.