10/28

昨日のスマブラが尾を引いて10時に起床 大阪まで友達に付き添ってもらってチャリを見に行く いいのがあったので同店の京都店で取り寄せしてもらうことに ちなみにGIANTのESCAPE AIRというクロスバイクです なんか自分の折りたたみより軽くて衝撃 これでさらに現実逃避がはかどる
思っていたより安く、お金が浮いたので丸善&ジュンク堂書店でノリで漫画やら本やらを買っていたら10k超えてしまった でも本買うのすごい気持ちよくて日ごろ疲弊している精神を少し回復できた感あった
京都に戻ってPC修理屋にノートPCを渡す 最高でも10kといわれたので、今出川通りにある某修理屋(40kだった 起訴)とは違う、店主も気さくないい店っぽかった そろそろZENBOOKのうすっぺらいキーボード恋しい
その後、アニマスのスタッフ本購入 大変満足のいく出来だったが、コミケのアレは別枠らしいので、やはりどこかで買う必要あるかなぁという感じ 値段イかれてるけどそこは愛でどうにかしたい
帰ってきて競技の練習 何気にいままでで一番生産性高かった勉強会だった気がする(いままでのひどさを露呈)
とりあえず蟻本の幅優先探索の例題のコードをば

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <algorithm>
#include <sstream>
#include <iostream>
#include <cassert>
#include <fstream>
#include<math.h>
 
#define FOR(i,k,n)      for (int i=(k); i<(int)(n); ++i)
#define REP(i,n) FOR(i,0,n)
#define FORIT(i,c)      for(__typeof((c).begin())i=(c).begin();i!=(c).end();++i)
#define sz       size()
#define lgt      length()
#define pb       push_back
#define mp       make_pair
#define ALL(X)   (X).begin(),(X).end()
#define SORT(a)  sort(ALL(a));
 
const long long mod = 1777777777;
 
using namespace std;
 
typedef pair<int,int> pint;
typedef vector<int> vi;
typedef vector<string>  vs;
typedef vector<vi>       vvi;
 
 
int toInt(string s){int v;istringstream sin(s);sin>>v;return v;}
double toDouble(string s){double v;istringstream sin(s);sin>>v;return v;}
template<class T>string toString(T x){ostringstream sout;sout<<x;return sout.str();}
vs form(string a,char s){a+=s;vs v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(b);b="";}else b+=a[i];}return v;}
vi formint(string a,char s){a+=s;vi v;string b;REP(i,a.lgt){if(a[i]==s){v.pb(toInt(b));b="";}else b+=a[i];}return v;}
int bfs(int x,int y);
char a[110][110];
int b[110][110];
 
 
int main(){
        REP(i,110){
                REP(j,110){
                        a[i][j] = 'o';//とりあえず'o'で埋める
                }
        }
        REP(i,110){
                REP(j,110){
                        b[i][j]=0;//とりあえず0で埋める
                }
        }
        
                
        int N,M;
        cin >> N >> M;
        for(int i=1;i<N+1;i++){
                for(int j=1;j<M+1;j++){
                        cin >> a[i][j];//迷路入力
                }
        }
        REP(i,N){
                REP(j,M){
                        if(a[i][j]=='S'){
                                cout << bfs(i,j) << endl;//スタートの位置をbfsに投げる
                        }
                }
        }
        
        
        return 0;
}
int bfs(int x,int y){
        queue<pint> q;
        q.push(mp(x,y));
        
        while(q.sz){
                if(a[q.front().first+1][q.front().second]=='.'){
                        q.push(mp(q.front().first+1,q.front().second));
                        b[q.front().first+1][q.front().second]=b[q.front().first][q.front().second]+1;
                }
                if(a[q.front().first][q.front().second+1]=='.'){
                        q.push(mp(q.front().first,q.front().second+1));
                        b[q.front().first][q.front().second+1]=b[q.front().first][q.front().second]+1;
                }
                if(a[q.front().first-1][q.front().second]=='.'){
                        q.push(mp(q.front().first-1,q.front().second));
                        b[q.front().first-1][q.front().second]=b[q.front().first][q.front().second]+1;
                }
                if(a[q.front().first][q.front().second-1]=='.'){
                        q.push(mp(q.front().first,q.front().second-1));
                        b[q.front().first][q.front().second-1]=b[q.front().first][q.front().second]+1;
                }
                if(a[q.front().first+1][q.front().second]=='G'){
                        return b[q.front().first][q.front().second]+1;
                        break;
                }
                if(a[q.front().first][q.front().second+1]=='G'){
                        return b[q.front().first][q.front().second]+1;
                        break;
                }
                if(a[q.front().first-1][q.front().second]=='G'){
                        return b[q.front().first][q.front().second]+1;
                        break;
                }
                if(a[q.front().first][q.front().second-1]=='G'){
                        return b[q.front().first][q.front().second]+1;
                        break;
                }
                q.pop();
        }
}

後半の頭悪い塊のようなところはまぁどうにかしようと思えばどうにかできるはず たぶん
ちゃんと幅優先書いたのは初めてなので忘れないうちになじましておきたいが
というかこれサンプルいっこしか試してないけどだいじょうぶなんかね・・・