1 条题解
-
0
std:
#include<bits/stdc++.h> using namespace std; const int N=1009; struct Box{ int l,r,u,d; }; Box b[N*N]; char mp[N][N]; int id[N][N]; int n,m; void getBox(int x,int y,int idx){ int i=x,j=y; while(mp[i][j]!='|') j--; b[idx].l=j; j=y; while(mp[i][j]!='|') j++; b[idx].r=j; j=y; while(mp[i][j]!='-') i--; b[idx].u=i; i=x; while(mp[i][j]!='-') i++; b[idx].d=i; for(j=b[idx].l;j<=b[idx].r;j++) id[b[idx].u][j]=idx; } #define UP 1 #define DOWN 2 #define LEFT 3 #define RIGHT 4 int pipeToBox(int x,int y,int dir){ while(!id[x][y]){ if(mp[x][y]=='|'){ x++; continue; } if(mp[x][y]=='-') { if(dir==LEFT) y--; else y++; continue; } if(dir==LEFT || dir==RIGHT){ x++,dir=DOWN; continue; } if(y>1 && mp[x][y-1]=='-') y--,dir=LEFT; else y++,dir=RIGHT; } return id[x][y]; } void dfs(int u){ for(int i=b[u].d;i>=b[u].u;i--){ //从下往上枚举水面高度 int v=0; if(b[u].l>1 && mp[i][b[u].l-1]=='-') //左侧有管道 v=pipeToBox(i,b[u].l-1,LEFT); if(b[u].r<m && mp[i][b[u].r+1]=='-') //右侧有管道 v=pipeToBox(i,b[u].r+1,RIGHT); if(v) dfs(v); } printf("%d\n",u); } bool isDigit(char ch){ return '0'<=ch&&ch<='9'; } int main(){ //freopen("flowchart.in","r",stdin); //freopen("flowchart.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%s",mp[i]+1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ if(!isDigit(mp[i][j])) continue; int id=mp[i][j]-'0'; while(j+1<m && isDigit(mp[i][j+1])) id=id*10+mp[i][++j]-'0'; getBox(i,j,id); } dfs(1); return 0; }
- 1
信息
- ID
- 3
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 6
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者