Codeforces Round #224 (Div. 2) D. Ksenia and Pawns
来源:互联网 发布:c语言兼容性问题 编辑:程序博客网 时间:2024/06/08 17:23
题意:
在棋盘上摆两个兵,按照棋盘指示走,两个兵只有在'#'格才能位于同一格,问怎样摆放使得两个兵走的步数之和最大。
思路:
找出最长的一条路(长度为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
- Codeforces Round #224 (Div. 2) D. Ksenia and Pawns
- CodeForces 382D Ksenia and Pawns
- CodeForces 382D Ksenia and Pawns __DFS
- Codeforces Round #224 (Div. 2)A. Ksenia and Pan Scales
- Codeforces Round #224 (Div. 2) A - Ksenia and Pan Scales
- Codeforces Round #224 (Div. 2) A. Ksenia and Pan Scales
- Codeforces Round #224 (Div. 2) E.Ksenia and Combinatorics
- Codeforces 382D Ksenia and Pawns(逆向dfs)
- codeforces 224 div.2 A. Ksenia and Pan Scales
- Codeforces Round #136 (Div. 2) D. Little Elephant and Array
- Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
- Codeforces Round #197 (Div. 2) D. Xenia and Bit Operations
- Codeforces Round #208 (Div. 2) D. Dima and Hares
- Codeforces Round #208 (Div. 2)D. Dima and Hares
- Codeforces Round #207 (Div. 2) D. Xenia and Hamming
- Codeforces Round #216 (Div. 2) D. Valera and Fools
- Codeforces Round #216 (Div. 2) D. Valera and Fools
- Codeforces Round #228 (Div. 2) D - Fox and Minimal path
- js nodeName nodeValue nodeType 属性介绍
- web工程外部js 方法不可用. 缓存,血的教训
- PDF页面编辑
- APACHE通过URL重写伪静态
- android webkit和html的10位数字
- Codeforces Round #224 (Div. 2) D. Ksenia and Pawns
- C++中智能指针的设计和使用
- bitmap画圆
- CGI之C语言篇
- Myeclipse安装 配置Maven
- easyui验证坐标正则
- 使用VPN技术随时随地访问你的个人电脑PC机
- VMware 网络连接设置 解决Ubuntu,Fedora 不能上网的问题
- [转载]ORACLE 10g 升级补丁(Patch)