Codeforces Round #220 (Div. 2) 解题报告
2013-12-19 02:12
459 查看
Problem A Inna and Pink Pony
题意:这一题实在太逗了。。。两个小时都在搞这一题。给一个n*m的棋盘。初始点在(x,y)然后有四种变幻(x+a,y-b)(x+a,y+b)(x-a,y-b)(x-a,y+b)。问你最少几步能到棋盘的四角。
解法:先判断能不能走到,能走到的一定是x,y方向差值能整除a,b的。然后他们的商之和为偶数。(这个画一个图很好理解)最后判一下棋盘的长宽必须大于a,b(易错!)若是不满足除非起始点就在四角否则走不到。
代码如下:
View Code
题意:这一题实在太逗了。。。两个小时都在搞这一题。给一个n*m的棋盘。初始点在(x,y)然后有四种变幻(x+a,y-b)(x+a,y+b)(x-a,y-b)(x-a,y+b)。问你最少几步能到棋盘的四角。
解法:先判断能不能走到,能走到的一定是x,y方向差值能整除a,b的。然后他们的商之和为偶数。(这个画一个图很好理解)最后判一下棋盘的长宽必须大于a,b(易错!)若是不满足除非起始点就在四角否则走不到。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <utility> #include <queue> #include <stack> #include <vector> #define ll long long #define INF 0x7fffffff #define eps 1E-6 #define LEN 1010 #define mp(a,b) make_pair(a,b) using namespace std; typedef pair<int, int> pii; int n, m, Map[LEN][LEN], f[LEN][LEN]; int xx[] = {0, 0, 1,-1}; int yy[] = {1,-1, 0, 0}; int dp(int x, int y, int st){ if(st >= n*m) return INF; if(f[x][y]!=-1)return f[x][y]; int ret = Map[x][y]=='A'?1:0; for(int i=0; i<4; i++){ int tx = x+xx[i]; int ty = y+yy[i]; if(tx>=0 && tx<n && ty>=0 && ty<m){ if(Map[x][y]=='D' && Map[tx][ty]=='I')ret = max(ret, dp(tx, ty, st+1)); if(Map[x][y]=='I' && Map[tx][ty] == 'M')ret = max(ret, dp(tx, ty, st+1)); if(Map[x][y]=='M' && Map[tx][ty] == 'A')ret = max(ret, dp(tx, ty, st+1)); if(Map[x][y]=='A' && Map[tx][ty] == 'D')ret = max(ret, dp(tx, ty, st+1)+1); } } return f[x][y] = ret; } int main() { // freopen("in.txt", "r", stdin); while(scanf("%d%d", &n, &m)!=EOF){ getchar(); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ scanf("%c", &Map[i][j]); } getchar(); } int ans = 0; memset(f, -1, sizeof f); for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ if(Map[i][j] == 'D'){ ans = max(ans, dp(i, j, 0)); if(ans == INF) break; } } } for(int i=0; i<n; i++){ for(int j=0; j<m; j++){ if(f[i][j]!=-1){ for(int k=0; k<4; k++){ int tx = i+xx[k]; int ty = j+yy[k]; if(tx>=0 && tx<n && ty>=0 && ty<m && Map[i][j]=='A' && Map[tx][ty]=='D'){ if(f[i][j]<=f[tx][ty] && f[i][j]>0){ans = INF;} } if(tx>=0 && tx<n && ty>=0 && ty<m && Map[i][j]=='D' && Map[tx][ty]=='I'){ if(f[i][j]<f[tx][ty] && f[i][j]>0){ans = INF;} } if(tx>=0 && tx<n && ty>=0 && ty<m && Map[i][j]=='I' && Map[tx][ty]=='M'){ if(f[i][j]<f[tx][ty] && f[i][j]>0){ans = INF;} } if(tx>=0 && tx<n && ty>=0 && ty<m && Map[i][j]=='M' && Map[tx][ty]=='A'){ if(f[i][j]<f[tx][ty] && f[i][j]>0){ans = INF;} } } } } } if(ans == 0)printf("Poor Dima!\n"); else if(ans == INF) printf("Poor Inna!\n"); else printf("%d\n", ans); } return 0; }
View Code
相关文章推荐
- Codeforces Round #281 (Div. 2) 解题报告 A.B.C.D.
- 解题报告:Codeforces Round #193 (Div. 2) C. Students' Revenge 贪心
- Codeforces Round #259 (Div. 2) 解题报告
- Codeforces Round #306 (Div. 2) D.E. 解题报告
- Codeforces Round #227 (Div. 2) 解题报告
- 【解题报告】Codeforces Round #303 (Div. 2)
- Codeforces Round #189 (Div. 2) 解题报告
- Codeforces Round #188 (Div. 2) 解题报告 //缺E
- 【解题报告】 SRM412_div1_250pt 和 SRM411_div2_900pt
- Topcoder SRM632 DIV2 解题报告
- codeforces Round #237(div2) B解题报告
- codeforces Round #237(div2) D解题报告
- Codeforces 410 div 2 【解题报告】
- Codeforces Round #165 (Div. 2) 解题报告
- Codeforces 474(#271 Div 2) 解题报告
- Codeforces Round #271 (Div. 2) 解题报告
- codeforces Round #263(div2) E解题报告
- 【解题报告】Codeforces Round #371 (Div. 2)
- Codeforces Round #243 (Div. 2) C. Sereja and Swaps 解题报告
- codeforces Round #259(div2) D解题报告