/* ID: himuhas1 TASK: contact LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 8192+2 void printBinary(int num) { int len; for(int i=13; i>-1; i--) { if(num & (1<<i)) { len = i; break; } } for(int i=len-1; i>-1; i--) if(num & (1<<i)) pf("1"); else pf("0"); } int main() { #ifndef henapc read("contact.in"); write("contact.out"); #endif int cnt[MAXX]; mem(cnt, 0); int A, B, N; string str; string inp; take(A, B, N); char c; cin.ignore(); while(true) { c = getchar(); if(c == EOF) break; if(c != '\n') str.pb(c); } //debug("str", str, "str"); B++; FOR(len, A, B) { int mask = 0; loop(i, len) { mask = mask*2 + (str[i] - '0'); } mask = mask | (1<<len); //if(len == 2) dump(mask); cnt[mask]++; FOR(i, len, SZ(str)) { //dump(i); mask = mask & ~(1<<len); mask = mask*2 + str[i]-'0'; mask = mask & ~(1<<len); mask = mask | (1<<len); //if(len == 2) dump(mask); cnt[mask]++; } //dump(cnt[4][2]); } map<int, vector<int> >all; paii temp; loop(i, MAXX) { if(cnt[i]) { all[cnt[i]].pb(i); } //debug("came here"); } int counting = 0; for(map<int, vector<int> >::iterator it = all.end(); it != all.begin() && counting < N;) { it--; counting++; pf("%d\n", it->fr); vector<int> &v = it->sc; printBinary(v[0]); FOR(i, 1, SZ(v)) { if(i%6 == 0) pf("\n"); else pf(" "); printBinary(v[i]); } pf("\n"); } return 0; }
Monthly Archives: June 2013
(USACO) Score Inflation
0/* ID: himuhas1 TASK: inflate LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 10002 ll best[MAXX]; int main() { #ifndef henapc read("inflate.in"); write("inflate.out"); #endif // henapc int given, cntGroups; int points, minitus; take(given, cntGroups); given++; loop(i, cntGroups) { take(points, minitus); FOR(i, minitus, given) { best[i] = max(best[i], best[i-minitus]+points); } } cout<<best[given-1]<<endl; return 0; }
(SPOJ) 8425. Coloring Trees
0#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define MAXX 100002 char color[MAXX]; int parent[MAXX]; vector<int>graph[MAXX]; int find(int u) { if(parent[u] == u) return u; return parent[u] = find(parent[u]); } int main() { int N; int x, a, b; sf("%d", &N); loop(i, N) { color[i] = -1; parent[i] = i; } N--; loop(i, N) { sf("%d %d", &a, &b); graph[a].pb(b); graph[b].pb(a); } int Q; sf("%d", &Q); loop(i, Q) { sf("%d %d %d", &x, &a, &b); if(x == 1) { color[a] = b; loop(i, SZ(graph[a])) { if(color[graph[a][i]] == b) { parent[find(a)] = find(graph[a][i]); } } } else if(x==2) { if(find(a) == find(b)) { if(a!=b || color[a] != -1 ) pf("YES\n"); else pf("NO\n"); } else pf("NO\n"); } } return 0; }
(SPOJ) 61. Brackets
0//link: http://www.spoj.com/problems/BRCKTS/ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here struct DATA { int needed_opening; int needed_closing; DATA() { needed_closing = needed_opening = 0; } }; #define MAXX 30002 DATA sum[4*MAXX]; char str[MAXX]; void insert(int idx, int st, int ed) { if(st == ed) { if(str[st] == '(') { sum[idx].needed_closing = 1; sum[idx].needed_opening = 0; } else { sum[idx].needed_opening = 1; sum[idx].needed_closing = 0; } } else { int l = idx*2; int r = l +1; int mid = (st+ed)/2; insert(l, st, mid); insert(r, mid+1, ed); int r_closing_min = min(sum[l].needed_closing, sum[r].needed_opening); sum[idx].needed_closing = sum[l].needed_closing - r_closing_min + sum[r].needed_closing; sum[idx].needed_opening = sum[r].needed_opening - r_closing_min + sum[l].needed_opening; } } void update(int idx, int st, int ed, int pos) { if(st == ed) { if(str[pos] == '(') { sum[idx].needed_closing--; sum[idx].needed_opening++; str[pos] = ')'; } else { sum[idx].needed_closing++; sum[idx].needed_opening--; str[pos] = '('; } } else { int l = idx*2; int r = l + 1; int mid = (st+ed)/2; if(pos <= mid) { update(l, st, mid, pos); } else { update(r, mid+1, ed, pos); } int r_closing_min = min(sum[l].needed_closing, sum[r].needed_opening); sum[idx].needed_closing = sum[l].needed_closing - r_closing_min + sum[r].needed_closing; sum[idx].needed_opening = sum[r].needed_opening - r_closing_min + sum[l].needed_opening; } } int main() { int stlen, m, k; loop(kaseno, 10) { pf("Test %d:\n", kaseno+1); sf("%d", &stlen); stlen--; sf("%s", str); insert(1, 0, stlen); sf("%d", &m); loop(i, m) { sf("%d", &k); if(k == 0) { if(sum[1].needed_closing == 0 && sum[1].needed_opening == 0) { pf("YES\n"); } else { pf("NO\n"); } } else { update(1, 0, stlen, k-1); } } } return 0; }
(USACO) Cow Tours
0/* ID: himuhas1 TASK: cowtour LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here int n; #define MAXX 151 #define INF 1e10 double dist[MAXX][MAXX]; char graph[MAXX][MAXX]; paii points[MAXX]; int parent[MAXX]; double maxDistFrom[MAXX]; template<typename T> T sqr(T a) { return a*a; } double calculateDist(paii a, paii b) { return sqrt( sqr(a.fr - b.fr) + sqr(a.sc - b.sc) ); } int find(int u) { if(parent[u] == u) return u; return parent[u] = find(parent[u]); } int main() { #ifndef hasibpc read("cowtour.in"); write("cowtour.out"); #endif // hasibpc take(n); int p, q; dd minDist = INF; //debug(minDist); loop(i, n) { take(points[i].fr, points[i].sc); parent[i] = i; } loop(i, n) { sf("%s", graph[i] ); loop(j, n) { if(graph[i][j] == '1') { dist[i][j] = calculateDist(points[i], points[j]); parent[find(i)] = find(j); } else { dist[i][j] = INF; } } } loop(k, n) loop(i, n) loop(j, n) if(dist[i][j] > dist[i][k] + dist[k][j]) dist[i][j] = dist[i][k] + dist[k][j]; map<int, double>mp; loop(i, n) { FOR(j, i+1, n) { if(find(i) == find(j)) { maxDistFrom[i] = max(maxDistFrom[i], dist[i][j]); maxDistFrom[j] = max(maxDistFrom[j], dist[j][i]); } } double &ret = mp[find(i)]; ret = max(ret, maxDistFrom[i]); } loop(i, n) { FOR(j, i+1, n) { if(find(i) != find(j)) { minDist = min(minDist, max(max(calculateDist(points[i], points[j]) + maxDistFrom[i] + maxDistFrom[j],mp[find(i)]), mp[find(j)]) ); } } } pf("%.6lf\n", minDist); return 0; }
(USACO) Fractions to Decimals
0/* ID: himuhas1 TASK: fracdec LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here int countDigit(int n) { if(n == 0) return 1; int res = 0; while(n > 0) { n /= 10; res++; } return res; } int main() { #ifndef hasibpc read("fracdec.in"); write("fracdec.out"); #endif // hasibpc int up, down; take(up, down); int rem; pf("%d.", up/down); int cnt = countDigit(up/down) + 1; rem = up % down; if(rem == 0) { pf("0\n"); } else { vector<int> v; map<int, int>mp; int *p; //debug("\n"); bool flag; while(rem > 0) { rem *= 10; //dump(rem); p = &mp[rem]; if(*p == 0) { *p = SZ(v) + 1; } else break; v.pb(rem/down); rem %= down; } if(rem > 0) { (*p)--; //dump(*p); //dump(rem); //debug(*p, rem); loop(i, *p) { if(cnt++ == 76) { pf("\n"); cnt = 1; } pf("%d", v[i]); } if(cnt++ == 76){ pf("\n"); cnt = 1; } pf("("); FOR(i, *p, SZ(v)) { if(cnt++ == 76) { pf("\n"); cnt = 1; } pf("%d", v[i]); } if(cnt++ == 76) { pf("\n"); cnt = 1; } pf(")\n"); } else { loop(i, SZ(v)) { if(cnt++ == 76) { pf("\n"); cnt = 1; } pf("%d", v[i]); } pf("\n"); } } return 0; }
Bessie Come Home (USACO)
0/* ID: himuhas1 TASK: comehome LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d%d", &a, &b) #define gi3(a, b, c) sf("%d%d%d", &a, &b, &c) #define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read freopen("input.txt", "r", stdin) #define write freopen("output.txt", "w", stdout) #define dump(x) cout<<#x<<" = "<<(int)x<<endl #define INF (1<<29) using namespace std; #define MAXX 52 vector<paii> graph[MAXX]; void toInt(char &c) { if('A' <= c && c <= 'Z') c = c -'A' + 26; else c = c - 'a'; } struct DATA{ char idx; int d; bool operator<(const DATA& a) const { return d > a.d; } }; int dist[MAXX]; void dijkstra() { paii result; result.sc = INF; priority_queue<DATA>Q; loop(i, MAXX) dist[i] = INF; dist[51] = 0; DATA u,v; u.idx = 51; u.d = 0; Q.push(u); while(!Q.empty()) { u = Q.top(); Q.pop(); //dump(u.idx); if(u.d && u.idx > 25 && u.d < result.sc) { result.fr = u.idx; result.sc = u.d; } if(dist[u.idx] == u.d) { loop(i, SZ(graph[u.idx])) { v.idx = graph[u.idx][i].fr; //cout<<"\t"; dump(v.idx); v.d = u.d + graph[u.idx][i].sc; if(dist[v.idx] > v.d ) { dist[v.idx] = v.d; Q.push(v); } } } } result.fr = result.fr - 26 + 'A'; cout<<(char)result.fr<<" "<<result.sc<<endl; } int main() { #ifndef hasibpc freopen("comehome.in", "r", stdin); freopen("comehome.out", "w", stdout); #endif // hasipc int paths; gi(paths); char a, b; int d; loop(i, paths) { cin.ignore(); sf("%c %c %d", &a, &b, &d); //dump(a); dump(b); dump(d); toInt(a); toInt(b); //dump(a); dump(b); graph[a].pb(MP(b,d)); graph[b].pb(MP(a,d)); } dijkstra(); return 0; }
Overfencing (USACO)
0/* ID: himuhas1 TASK: maze1 LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<utility> #include<string> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d %d", &a, &b) #define sf scanf #define pf printf #define pb push_back #define fr first #define sc second #define MP make_pair #define PI acos(-1.0) #define INF 1<<29; #define ll long long #define paii pair<int, int> #define all(v) v.begin(), v.end() #define SZ(a) int(a.size()) #define dd double #define mem(a, v) memset(a, v, sizeof(a)) #define dump(x) cout<<#x<<" = "<<(int)x<<endl; using namespace std; #define CONDITION -1 < tmp.fr && tmp.fr < rows && -1 < tmp.sc && tmp.sc < columns && graph[tmp.fr][tmp.sc] ==' ' int columns, rows; char graph[202][78]; paii exits[2]; int bfs(paii u, paii v) { //dump(u.fr); dump(u.sc); dump(v.fr); dump(v.sc); char dir[] = {-1, 0, 1, 0}; int dist[202][78]; bool visited[202][78]; int finalDist = 0; mem(visited, 0); paii tmp; loop(i, 4) { tmp.fr = u.fr + dir[i]; tmp.sc = u.sc + dir[(i+1)%4]; if(CONDITION) { u = tmp; break; } } loop(i, 4) { tmp.fr = v.fr + dir[i]; tmp.sc = v.sc + dir[(i+1)%4]; if(CONDITION) { v = tmp; break; } } dist[u.fr][u.sc] = dist[v.fr][v.sc] = 0; visited[u.fr][u.sc] = visited[v.fr][v.sc] = 1; queue<paii>Q; Q.push(u); Q.push(v); while(!Q.empty()) { u = Q.front(); Q.pop(); loop(i, 4) { tmp.fr = u.fr + dir[i]; tmp.sc = u.sc + dir[(i+1)%4]; if(CONDITION) { tmp.fr += dir[i]; tmp.sc += dir[(i+1)%4]; if(CONDITION && !visited[tmp.fr][tmp.sc] ) { //dump(u.fr); dump(u.sc); dump(tmp.fr); dump(tmp.sc); cout<<endl; visited[tmp.fr][tmp.sc] = 1; finalDist = max(dist[tmp.fr][tmp.sc] = dist[u.fr][u.sc] + 1, finalDist); //dump(finalDist); Q.push(tmp); } } } } return finalDist+1; } int main() { #ifndef hasibpc freopen("maze1.in", "r", stdin); freopen("maze1.out", "w", stdout); #endif gi2(columns, rows); columns = columns*2 + 1; rows = rows*2 + 1; cin.ignore(); loop(i, rows) { gets(graph[i]); } { char x = 0; for(int i=1; i<columns; i++) { //dump(graph[0][i]); //dump(i); if(graph[0][i] == ' ') exits[x++] = MP(0, i); if(graph[rows-1][i] == ' ') exits[x++] = MP(rows-1, i); } for(int i=1; i<rows; i++) { //dump(graph[i][0]); //cout<<int(graph[i][0])<<" "<<int(' ')<<endl; if(graph[i][0] == ' ') exits[x++] = MP(i, 0); if(graph[i][columns-1] == ' ') exits[x++] = MP(i, columns-1); } //dump(x); } cout<<bfs(exits[0], exits[1])<<endl; return 0; }
The Tamworth Two (USACO)
0/* ID: himuhas1 LANG: C++ TASK: ttwo */ #include<iostream> #include<cstring> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include<map> #include<set> #include<vector> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d %d", &a, &b) #define dump(x) cout<<#x<<" = "<<x<<endl; #define mem(a, v) memset(a, v, sizeof(a)) #define PI acos(-1.0) #define INF 1<<29 #define pb push_back #define fr first #define sc second #define MP make_pair #define paii pair<int, int> #define ll long long #define pall pair<ll, ll> using namespace std; #define MAXX 11 #define VISITED(far, cow,dirF,dirC) visited[far.fr][far.sc][dirF][cow.fr][cow.sc][dirC] char graph[MAXX][MAXX]; bool visited[MAXX][MAXX][4][MAXX][MAXX][4]; paii farmer, cows; int dirx[] = {-1, 0, 1, 0}; int diry[] = {0, 1, 0,-1}; int dfs() { mem(visited, 0); char dirFarmer = 0, dirCows = 0; paii temp; int dist = 0; while(VISITED(farmer, cows,dirFarmer,dirCows)==0 && farmer != cows) { //dump(dist); VISITED(farmer, cows,dirFarmer, dirCows) = 1; temp.fr = farmer.fr + dirx[dirFarmer]; temp.sc = farmer.sc + diry[dirFarmer]; if(-1<temp.fr && temp.fr < 10 && -1 < temp.sc && temp.sc < 10 && graph[temp.fr][temp.sc] != '*') farmer = temp; else dirFarmer = (dirFarmer+1)%4; temp.fr = cows.fr + dirx[dirCows]; temp.sc = cows.sc + diry[dirCows]; if(-1<temp.fr && temp.fr < 10 && -1 < temp.sc && temp.sc < 10 && graph[temp.fr][temp.sc] != '*') cows = temp; else dirCows = (dirCows+1)%4; dist++; //dump(farmer.fr); dump(farmer.sc); dump(cows.fr); dump(cows.sc); } if(farmer == cows) return dist; else return 0; } int main() { freopen("ttwo.in", "r", stdin); freopen("ttwo.out", "w", stdout); loop(i, 10) { sf("%s", graph[i]); loop(j, 10) { if(graph[i][j] == 'F') farmer = MP(i, j); else if(graph[i][j] == 'C') cows = MP(i, j); } } cout<<dfs()<<endl; }