【electric fence】 /* ID: wangqia6 TASK: fence9 LANG: C++ */ #include <fstream> #include <cmath> using namespace std; ifstream fin ("fence9.in"); ofstream fout ("fence9.out"); long gcd(long a,long b) { if (! b) return a; else return gcd(b,a % b); } int main() { long n,m,p; fin >> n >> m >> p; long b = gcd(n,m) + p + gcd(abs(n - p),m); long a = (p * m + 2 - b) >> 1; fout << a << endl; fin.close(); fout.close(); return 0; } 【snail trails】 /* ID: wangqia6 TASK: snail LANG: C++ */ #include <fstream> #include <cstring> using namespace std; ifstream fin ("snail.in"); ofstream fout ("snail.out"); const long NMAX = 125; const long dx[4] = {0,1,0,-1}; const long dy[4] = {1,0,-1,0}; bool vis[NMAX][NMAX],wall[NMAX][NMAX]; long n,m,i,x,y,ans = 1; char ch; void dfs(long i, long j, long tot, long path,bool lft, bool rgt) { long k,count = 0; while ((! vis[i + dx[path]][j + dy[path]]) && (! wall[i + dx[path]][j + dy[path]])) { i += dx[path]; j += dy[path]; vis[i][j] = true; tot++; count++; } if ((vis[i + dx[path]][j + dy[path]]) && (ans < tot)) ans = tot; else if (wall[i + dx[path]][j + dy[path]]) { if ((count) || (! rgt)) dfs(i,j,tot,(path + 1) & 3,true,false); if ((count) || (! lft)) dfs(i,j,tot,(path + 3) & 3,false,true); } for (k = 0; k < count; k++) { vis[i][j] = false; i -= dx[path]; j -= dy[path]; } return; } int main() { memset(vis,0,sizeof(vis)); memset(wall,0,sizeof(wall)); fin >> n >> m; for (i = 0; i < m; i++) { fin >> ch >> x; y = long (ch - 'A') + 1; wall[x][y] = true; } for (i = 0; i <= n + 1; i++) { wall[0][i] = true; wall[i][0] = true; wall[n + 1][i] = true; wall[i][n + 1] = true; } vis[1][1] = true; dfs(1,1,1,1,false,false); dfs(1,1,1,0,false,false); fout << ans << endl; fin.close(); fout.close(); return 0; }