2017.10.15 补题: F.J
来源:互联网 发布:mac抹掉磁盘 编辑:程序博客网 时间:2024/05/16 10:49
F的链表其实很水,只是我老想着边做边输出,这样当然不可能,,可能还是链表用的不太熟练。。
看别人很快的代码:https://vjudge.net/solution/11074286
J题:
参考:https://vjudge.net/solution/11080538
根据贪心的原则,要把时间都用完,所以枚举一下斜率来看时间是多少。
H题:
参考:https://vjudge.net/solution/11078116
分两者情况,反正很好的考验代码能力的题目。
#include <bits/stdc++.h>using namespace std;#define N 16#define INF 100000000#define LL long long#define P pair<int,int>#define fi first#define se secondint n,m;int typ[N][N];char tu[N][N];int dx[]={0,1,0,-1},dy[]={1,0,-1,0};int cnt;P pre[N][N][N][N];int dis[N][N][N][N];void dfs(int x,int y){ typ[x][y]=cnt; for(int i=0;i<4;++i){ int nx=x+dx[i],ny=y+dy[i]; if(nx<1||nx>n||ny<1||ny>m||typ[nx][ny]||tu[nx][ny]=='.')continue; dfs(nx,ny); }}bool Min(int &x,int y){ if(x>y)x=y;return 1; return 0;}void init(int sx,int sy){ for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) dis[sx][sy][i][j]=INF; dis[sx][sy][sx][sy]=0; queue<P>Q; Q.push(P(sx,sy)); while(!Q.empty()){ P tmp=Q.front();Q.pop(); int x=tmp.fi,y=tmp.se; for(int i=0;i<4;++i){ int nx=x+dx[i],ny=y+dy[i]; if(nx<1||nx>n||ny<1||ny>m){ if(Min(dis[sx][sy][n][m],dis[sx][sy][x][y]+1)){ pre[sx][sy][n][m]=P(x,y); }continue; } if(tu[nx][ny]=='X'){ if(Min(dis[sx][sy][nx][ny],dis[sx][sy][x][y]+1)){ pre[sx][sy][nx][ny]=P(x,y); } } if(dis[sx][sy][nx][ny]!=INF)continue; dis[sx][sy][nx][ny]=dis[sx][sy][x][y]+1; pre[sx][sy][nx][ny]=P(x,y); Q.push(P(nx,ny)); } }}int ans=INF,ans1=INF;void find1(P a2,P a1){ int nowx=a1.fi,nowy=a2.se; int ex=a2.fi,ey=a2.se; while(nowx!=ex||nowy!=ey){ if(tu[nowx][nowy]=='.')tu[nowx][nowy]='*'; int nx=pre[ex][ey][nowx][nowy].fi; int ny=pre[ex][ey][nowx][nowy].se; nowx=nx;nowy=ny; } if(tu[nowx][nowy]=='.')tu[ex][ey]='*';}P poi[3];int main(){ while(~scanf("%d%d",&n,&m)){ memset(typ,0,sizeof(typ)); memset(dis,0x3f,sizeof(dis)); cnt=0; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) scanf("%c",&tu[i][j]); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(!typ[i][j]&&tu[i][j]=='X')++cnt,dfs(i,j); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) printf("%d%c",typ[i][j],j==m?'\n':' '); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) init(i,j); int ff=0; int ans=INF; for(int s1=1;s1<=n;++s1) for(int s2=1;s2<=m;++s2){ if(tu[s1][s2]=='.')continue; for(int s3=1;s3<=n;++s3) for(int s4=1;s4<=m;++s4){ if(tu[s3][s4]=='.'||typ[s1][s2]==typ[s3][s4])continue; if(Min(ans,dis[s1][s2][n][m]+dis[s3][s4][n][m])){ ff=0;poi[1]=P(s1,s2);poi[2]=P(s3,s4); } for(int s5=1;s5<=n;++s5){ for(int s6=1;s6<=m;++s6){ if(tu[s5][s6]=='X')continue; if(Min(ans,dis[s1][s2][s5][s6]+dis[s3][s4][s5][s6]+dis[s5][s6][n][m])){ ff=1;poi[0]=P(s5,s6),poi[1]=P(s1,s2),poi[2]=P(s3,s4); } } } } } if(ff){ find1(poi[0],poi[1]); find1(poi[0],poi[2]); find1(poi[0],P(n,m)); } else{ find1(poi[1],P(n,m)); find1(poi[2],P(n,m)); } for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) cout<<tu[i][j]; }}
阅读全文
0 0
- 2017.10.15 补题: F.J
- 并查集训练题解(F-J)
- 问题 J F. Be Good at Gaussing
- 对数组 {'f','F','K','A','a','j','z'} 排序
- CF Educational Round 19 797 (F题DP+RMQ)以后补
- Educational Codeforces Round 5 [补F]
- hihoCoder题库1051补提交f卡
- J题
- 武大校赛PE补题(有一个邻接矩阵求m步从i到j的方法数)
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- 补题
- F题
- 第9周项目——星图补录 (f)
- Atcoer Grand Contest 001 F 拓补排序 STL
- 资格赛j题
- NOJ J题 FootBall
- J题 游戏模拟
- 《ACM程序设计》 J题
- 项目启动一直报Could not resolve placeholder错误
- CentOS7安装到U盘-安装过程与部分疑难问题
- java环境配置
- 使用命令行方式编译java代码时主类无法加载的问题
- OkHttp的网络请求数据和RecyclerView的多条目加载,添加分割线
- 2017.10.15 补题: F.J
- oracle11g 修改字符集 修改为ZHS16GBK
- HTML中input和button解决等高不对齐的原因
- Flex弹性布局
- pandas移除重复项
- Bubble Sort MIPS
- 智能传感器深度报告:未来机器感官的百亿美元市场【附下载】| 智东西内参
- 网络请求
- spring in action 学习笔记(九)使用注解进行装配