您的位置:首页 > 其它

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(易错!)若是不满足除非起始点就在四角否则走不到。

代码如下:

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: