結果

問題 No.402 最も海から遠い場所
ユーザー rapurasurapurasu
提出日時 2016-07-25 00:55:56
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 2,268 ms / 3,000 ms
コード長 2,641 bytes
コンパイル時間 2,110 ms
コンパイル使用メモリ 172,080 KB
実行使用メモリ 171,272 KB
最終ジャッジ日時 2023-08-06 12:58:38
合計ジャッジ時間 11,777 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ(β)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 5 ms
4,376 KB
testcase_01 AC 5 ms
4,376 KB
testcase_02 AC 6 ms
4,376 KB
testcase_03 AC 5 ms
4,376 KB
testcase_04 AC 5 ms
4,376 KB
testcase_05 AC 6 ms
4,376 KB
testcase_06 AC 5 ms
4,380 KB
testcase_07 AC 5 ms
4,380 KB
testcase_08 AC 6 ms
4,376 KB
testcase_09 AC 5 ms
4,376 KB
testcase_10 AC 5 ms
4,376 KB
testcase_11 AC 6 ms
4,376 KB
testcase_12 AC 6 ms
4,380 KB
testcase_13 AC 14 ms
4,380 KB
testcase_14 AC 8 ms
4,376 KB
testcase_15 AC 52 ms
5,136 KB
testcase_16 AC 81 ms
6,496 KB
testcase_17 AC 931 ms
55,996 KB
testcase_18 AC 2,268 ms
44,680 KB
testcase_19 AC 1,900 ms
171,272 KB
testcase_20 AC 1,684 ms
40,376 KB
testcase_21 AC 1,747 ms
106,212 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for (int i=(a);i<(b);i++)
#define RFOR(i,a,b) for (int i=(b)-1;i>=(a);i--)
#define REP(i,n) for (int i=0;i<(n);i++)
#define RREP(i,n) for (int i=(n)-1;i>=0;i--)
int dp[3002][3002];
#define INF 10000
#define MAX_V 10000000

struct edge{int to ,cost;};
typedef pair<int,int> P; //firstは最短距離,secondは頂点の番号

int V;
int d[MAX_V];
priority_queue<P,vector<P>,greater<P> > que;
int H,W;
void dijkstra(int s){
   //greater<P>を指定することでfirstが小さい順に取り出せる

   fill(d,d+V,INF);
   //d[s]=0;
   //queue.push(P(0,s));
   while(!que.empty()){
      P p=que.top();que.pop();
      int v=p.second;
      if(d[v] < p.first)continue;
      for(int i=-1;i<=1;i++){
          for(int j=-1;j<=1;j++){
              if(i==0&&j==0)continue;
              int a=0;
              a=v+(i*1)+j*(W+2);
              if(a<0||(a>=(H+2)*(W+2)))continue;
              if((v%(W+2)==0&&i==-1)||(v%(W+2)==W+1&&i==1))continue;
/*
          switch(i){
             case 0:
                if(v-1<0)continue;
                a=v-1;
             break;
             case 1:
                if(v-W-2<0)continue;
                a=v-W-2;
             break;
             case 2:
                if(v%(W+2)==W+1)continue;
                a=v+1;
             break;
             case 3:
                if(v+W+2>(H+2)*(W+2))continue;
                a=v+H+2;
             break;
             case 4:
                if(v)
          }
*/
             if(d[a]>d[v]+1){
                 d[a]=d[v]+1;
                 que.push(P(d[a],a));
             }
          }
      }
/*
cout<<v<<endl;
REP(i,H+2){
    REP(j,W+2){
        cout<<d[i*(W+1)+j]<<" ";
    }
cout<<endl;
}
cout<<endl;
*/
   }

}


int main(){
        cin>>H>>W;
        REP(i,H+2){
            REP(j,W+2){
                if(i==0||i==H+1||j==0||j==W+1){
                       d[i*(W+2)+j]=0;
                       que.push(P(0,i*(W+2)+j));
                }else{
                       d[i*(W+2)+j]=INF;
                }
            }
        }
        REP(i,H){
            string S;
            cin>>S;
            REP(j,W){
                if(S[j]=='.'){
                       d[(i+1)*(W+2)+(j+1)]=0;
                       que.push(P(0,(i+1)*(W+2)+j+1));
                }else{
                       d[(i+1)*(W+2)+j+1]=INF;
                }
            }
        }
        dijkstra(0);
        int m=-1;
/*
REP(i,H+2){
    REP(j,W+2){
        cout<<d[i*(W+2)+j]<<" ";
    }
    cout<<endl;
}
*/

        REP(i,MAX_V){
            m=max(m,d[i]);
        }

        cout<<m<<endl;
	return(0);
}
0