寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

AtCoder Problems in C++ #D - 薄氷渡り

第8回日本情報オリンピック 予選(過去問)から、その提出コードの解答例です。
AtCoderとは、コンテストを通じて、プログラミングやアルゴリズムを学習するサービスです。
atcoder.jp
プログラミングコンテストとは、「与えられた問題をいかに素早く、正確に」解くことができるかを競うものです。
競技プログラミング」を略して、「競プロ」などと呼ばれています。

#D - 薄氷渡り

https://atcoder.jp/contests/joi2009yo/tasks/joi2009yo_d

僕が作成、提出したコードは、以下のとおりです。

/*
AtCoder Problems in C++
#D - 薄氷渡り
https://atcoder.jp/contests/joi2009yo/tasks/joi2009yo_d
提出コードの解答例
https://neguse-atama.hatenablog.com
*/
#include<bits/stdc++.h>
using namespace std;
const int nn[4]={-1,0,1,0};
const int mm[4]={0,1,0,-1};
int n,m;
vector<vector<int>> ice;
int ans=0;
void DFS(int n1,int m1,int cnt){
  ice[n1][m1]=0;
  cnt++;
  ans=max(ans,cnt);
  for(int i=0;i<4;i++){
    int n2=n1+nn[i];
    int m2=m1+mm[i];
    if((0<=n2 && n2<n) && (0<=m2 && m2<m)){
      if(ice[n2][m2]==1){
        DFS(n2,m2,cnt);
      }
    }
  }
  ice[n1][m1]=1;
}
int main(void){
  cin>>n>>m;
  ice.resize(n);
  for(int i=0;i<n;i++){
    ice[i].resize(m);
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      cin>>ice[i][j];
    }
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      if(ice[i][j]==1){
        DFS(i,j,0); 
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}