Codeforces Round #224 (Div. 2) D. Ksenia and Pawns

来源:互联网 发布:c语言兼容性问题 编辑:程序博客网 时间:2024/06/08 17:23
D. Ksenia and Pawns
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Ksenia has a chessboard of size n × m. Each cell of the chessboard contains one of the characters: "<", ">", "^", "v", "#". The cells that contain character "#" are blocked. We know that all chessboard cells that touch the border are blocked.

Ksenia is playing with two pawns on this chessboard. Initially, she puts the pawns on the chessboard. One cell of the chessboard can contain two pawns if and only if the cell is blocked. In other cases two pawns can not stand in one cell. The game begins when Ksenia put pawns on the board. In one move, Ksenia moves each pawn to a side adjacent cell in the direction of arrows painted on the cell on which the corresponding pawn sits (if the pawn sits on "#", it does not move). Assume that Ksenia moves pawns simultaneously (see the second test case).

Of course, Ksenia plays for points. How can one calculate the points per game? Very simply! Let's count how many movements the first pawn made and how many movements the second pawn made, sum these two numbers — it will be the resulting score of the game.

Ksenia wonders: what is the maximum number of points she can earn (for that, she should place the pawns optimally well early in the game). Help her and find that number.

Input

The first line contains two integers, n and m (1 ≤ n, m ≤ 2000) — the sizes of the board. Each of the following n lines contains mcharacters – the board's description. Each character is one of the characters: "<", ">", "^", "v", "#".

It is guaranteed that the border cells of the table are blocked cells (with character "#").

Output

If Ksenia can get infinitely many points, print -1. Otherwise, print the maximum number of points she can get.

Sample test(s)
input
1 1#
output
0
input
3 4#####>^#####
output
3
input
3 4#####><#####
output
-1
input
7 5#######v####v#########^####^#######
output
4
input
7 5#######v####v####<####^####^#######
output
5



题意:

在棋盘上摆两个兵,按照棋盘指示走,两个兵只有在'#'格才能位于同一格,问怎样摆放使得两个兵走的步数之和最大。


思路:

找出最长的一条路(长度为best),如果有两条不相同的,则为2*best ,若两条路有交集,则为 2*best-1 (一前一后放),由于路径固定,可将一条路径标记,看其他的是否与其有不为‘#’的交集就够了。


代码:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define maxn 2005#define MAXN 400005#define mod 1000000000#define INF 0x3f3f3f3f#define pi acos(-1.0)#define eps 1e-6typedef long long ll;using namespace std;int n,m,k,ans,cnt,tot,flag;char mp[maxn][maxn];bool vis[maxn][maxn];int dp[maxn][maxn];int nx[maxn*maxn],ny[maxn*maxn];int dfs(int x,int y){    if(dp[x][y]!=-1) return dp[x][y];    int i,j,t,best=0;    if(mp[x][y]=='^')    {        if(vis[x-1][y]) return INF;        vis[x-1][y]=1;        t=dfs(x-1,y);        vis[x-1][y]=0;    }    else if(mp[x][y]=='v')    {        if(vis[x+1][y]) return INF;        vis[x+1][y]=1;        t=dfs(x+1,y);        vis[x+1][y]=0;    }    else if(mp[x][y]=='<')    {        if(vis[x][y-1]) return INF;        vis[x][y-1]=1;        t=dfs(x,y-1);        vis[x][y-1]=0;    }    else if(mp[x][y]=='>')    {        if(vis[x][y+1]) return INF;        vis[x][y+1]=1;        t=dfs(x,y+1);        vis[x][y+1]=0;    }    else t=-1;    dp[x][y]=t+1;    return t+1;}void dfs1(int x,int y){ //   printf("x:%d y:%d\n",x,y);    if(mp[x][y]=='#')    {        if(k) flag=1;        return ;    }    vis[x][y]=1;    if(mp[x][y]=='^')    {        if(!vis[x-1][y]) dfs1(x-1,y);    }    else if(mp[x][y]=='v')    {        if(!vis[x+1][y]) dfs1(x+1,y);    }    else if(mp[x][y]=='<')    {        if(!vis[x][y-1]) dfs1(x,y-1);    }    else if(mp[x][y]=='>')    {        if(!vis[x][y+1]) dfs1(x,y+1);    }}void solve(){    int i,j,t,best=-1;    cnt=0;    memset(dp,-1,sizeof(dp));    memset(vis,0,sizeof(vis));    for(i=1; i<=n; i++)    {        for(j=1; j<=m; j++)        {            if(mp[i][j]!='#')            {                vis[i][j]=1;                t=dfs(i,j);                vis[i][j]=0;                if(t>best)                {                    best=t;                    cnt=1;                    nx[1]=i,ny[1]=j;                }                else if(t==best)                {                    cnt++;                    nx[cnt]=i,ny[cnt]=j;                }                if(best>=INF)                {                    ans=-1;                    return ;                }            }        }    }    if(best==-1)    {        ans=0;        return ;    }    memset(vis,0,sizeof(vis));    k=0;    dfs1(nx[1],ny[1]);    flag=0;    k=1;    for(i=2;i<=cnt;i++)    {        dfs1(nx[i],ny[i]);        if(flag) break ;    }    ans=2*best-1+flag;}int main(){    int i,j,t;    while(~scanf("%d%d",&n,&m))    {        for(i=1; i<=n; i++)        {            scanf("%s",mp[i]+1);        }        solve();        printf("%d\n",ans);    }    return 0;}




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 20岁了不想长大怎么办 网吧老板跑路了怎么办 网吧玩地下城卡怎么办 个人公积金封存之前厂子欠费怎么办 学生欠了2万块怎么办 玉米去完库存量cool怎么办 幸福蓝海电子券过期怎么办 幸福蓝海国际影城会员怎么办 幸福蓝海会员卡过期了怎么办 电机线圈处于平衡位置怎么办 混联电路求电功率最小怎么办 电脑超出工作频率范围怎么办 手机红外线感应器坏了怎么办 我的世界左右慢怎么办 发电机自动启停装置故障怎么办 如果自动启停没关发动机涉水怎么办 偏激的人不分手怎么办 被极端的人纠缠怎么办 对固执偏激的人怎么办 车子右前轮偏磨怎么办? 轮胎边缘磨黑了怎么办 36周胎儿绕颈一周怎么办 孕中期胎儿偏小怎么办 怀孕34周偏小2周怎么办 胎盘低怎么办6个月了 怀孕四个月胎盘低怎么办 怀孕五个月胎盘低怎么办 怀孕3个月胎盘低怎么办 怀孕三个月了胎盘低怎么办 新房交房开发商拿不出证件怎么办? 新干式变压器未送电进水怎么办 三相380转单相220怎么办 外国人一直找你出去怎么办 美团众包跑腿单物品太重怎么办 美团退款成功后 物品怎么办 win10电脑没有网络图标怎么办 电脑开机桌面什么都没有怎么办 xp桌面什么都没有了怎么办 手机下滑通知栏不见了怎么办 跑800米赶上月经怎么办 强迫症吃药没效怎么办