【the tarmworth two】 /* ID: wangqia6 TASK: ttwo LANG: C++ */ #include <fstream> #include <cstring> using namespace std; const int DX[4] = {-1,0,1,0}; const int DY[4] = {0,1,0,-1}; const long MAXNUM = 160002; bool use[15][15]; int main() { ifstream cin("ttwo.in"); ofstream cout ("ttwo.out"); memset(use,0,sizeof(use)); long i,j; int xa,ya,xb,yb,da = 0,db = 0; char ch; for (i = 1; i <= 10; i++) { for (j = 1; j <= 10; j++) { cin.get(ch); if (ch != '*') use[i][j] = true; if (ch == 'F') { xa = i; ya = j; } if (ch == 'C') { xb = i; yb = j; } } cin.get(ch); } bool flag = false; for (i = 1; i <= MAXNUM; i++) { if (use[xa + DX[da]][ya + DY[da]]) { xa += DX[da]; ya += DY[da]; } else da = (da + 1) % 4; if (use[xb + DX[db]][yb + DY[db]]) { xb += DX[db]; yb += DY[db]; } else db = (db + 1) % 4; if ((xa == xb) && (ya == yb)) { flag = true; cout << i << endl; break; } } if (! flag) cout << 0 << endl; cin.close(); cout.close(); return 0; } 【overfencing】 /* ID: wangqia6 TASK: maze1 LANG: C++ */ #include <fstream> #include <cstring> using namespace std; ifstream cin ("maze1.in"); ofstream cout ("maze1.out"); const int NMAX = 300; const int INF = 20000; struct { int i,j; } que[NMAX * NMAX]; int m,n,xa,xb,ya,yb,head,tail,dist[NMAX][NMAX],best[NMAX][NMAX]; string data[NMAX]; bool flag = false,vis[NMAX][NMAX]; void initdata() { memset(best,INF,sizeof(best)); cin >> m >> n; int i; for (i = 0; i <= 2 * n + 1; i++) getline(cin,data[i]); return; } void find_exit() { int i; for (i = 1; i <= m; i++) { if ((data[1][2 * i - 1] == ' ') && (! flag)) { xa = 1; ya = i; flag = true; } if ((data[1][2 * i - 1] == ' ') && (flag)) { xb = 1; yb = i; } if ((data[2 * n + 1][2 * i - 1] == ' ') && (! flag)) { xa = n; ya = i; flag = true; } if ((data[2 * n + 1][2 * i - 1] == ' ') && (flag)) { xb = n; yb = i; } } for (i = 1; i <= n; i++) { if ((data[2 * i][0] == ' ') && (! flag)) { xa = i; ya = 1; flag = true; } if ((data[2 * i][0] == ' ') && (flag)) { xb = i; yb = 1; } if ((data[2 * i][2 * m] == ' ') && (! flag)) { xa = i; ya = m; flag = true; } if ((data[2 * i][2 * m] == ' ') && (flag)) { xb = i; yb = m; } } return; } void push(int x,int y,int d) { if (vis[x][y]) return; tail++; que[tail].i = x; que[tail].j = y; vis[x][y] = true; dist[x][y] = d; return; } void bfs(int x,int y) { memset(vis,0,sizeof(vis)); head = 0; tail = -1; push(x,y,1); int a,b,ii,jj,dd; while (head <= tail) { ii = que[head].i; jj = que[head].j; dd = dist[ii][jj]; a = 2 * ii; b = 2 * jj; if ((data[a][b - 2] == ' ') && (b != 2)) push(ii,jj - 1,dd + 1); if ((data[a][b] == ' ') && (b != 2 * m)) push(ii,jj + 1,dd + 1); if ((data[a - 1][b - 1] == ' ') && (a != 2)) push(ii - 1,jj,dd + 1); if ((data[a + 1][b - 1] == ' ') && (a != 2 * n)) push(ii + 1,jj,dd + 1); head++; } for (ii = 1; ii <= n; ii++) for (jj = 1; jj <= m; jj++) if (dist[ii][jj] < best[ii][jj]) best[ii][jj] = dist[ii][jj]; return; } void get_ans() { int i,j,tmp = -1; for (i = 1; i <= n; i++) for (j = 1; j<= m; j++) if (best[i][j] > tmp) tmp = best[i][j]; cout << tmp << endl; cin.close(); cout.close(); return; } int main() { initdata(); find_exit(); bfs(xa,ya); bfs(xb,yb); get_ans(); return 0; } 【cow tours】 /* ID: wangqia6 TASK: cowtour LANG: C++ */ #include <fstream> #include <cstring> #include <cmath> using namespace std; const int NMAX = 155; const double INF = 1e7; const double ZERO = 1e-9; int n,color = 0,vis[NMAX]; long x[NMAX],y[NMAX]; double dist[NMAX][NMAX],len[NMAX],longest[NMAX],ans = INF; inline double sqr(double x) { return x * x; } inline double calc_dist(int i,int j) { return sqrt(sqr(y[i] - y[j]) + sqr(x[i] - x[j])); } void initdata() { ifstream cin ("cowtour.in"); int i,j; string tmp; cin >> n; for (i = 0; i < n; i++) cin >> x[i] >> y[i]; for (i = 0; i < n; i++) { cin >> tmp; for (j = 0; j < n; j++) if ((tmp[j] == '1') || (i == j)) dist[i][j] = calc_dist(i,j); else dist[i][j] = INF; } cin.close(); return; } void floyd() { int i,j,k; for (k = 0; k < n; k++) for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (dist[i][k] + dist[k][j] + ZERO < dist[i][j]) dist[i][j] = dist[i][k] + dist[k][j]; return; } void find_part() { int i,j; memset(vis,0,sizeof(vis)); for (i = 0; i < n; i++) if (vis[i] == 0) { color++; len[color] = 0; vis[i] = color; for (j = 0; j < n; j++) if (dist[i][j] != INF) vis[j] = color; } for (i = 0; i < n; i++) for (j = 0; j < n; j++) if ((vis[i] == vis[j]) && (dist[i][j] > len[vis[i]] + ZERO)) len[vis[i]] = dist[i][j]; return; } void find_long() { int i,j; for (i = 0; i < n; i++) { longest[i] = 0; for (j = 0; j < n; j++) if ((vis[i] == vis[j]) && (dist[i][j] > longest[i] + ZERO)) longest[i] = dist[i][j]; } return; } void find_dist() { int i,j,k; double tmp; for (i = 0; i < n; i++) for (j = 0; j < n; j++) if (vis[i] != vis[j]) { tmp = longest[i] + longest[j] + calc_dist(i,j); for (k = 1; k <= color; k++) if (len[k] > tmp + ZERO) tmp = len[k]; if (tmp + ZERO < ans) ans = tmp; } return; } void outitdata() { ofstream cout ("cowtour.out"); cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(6); cout << ans << endl; cout.close(); return; } int main() { initdata(); floyd(); find_part(); find_long(); find_dist(); outitdata(); return 0; }