题解:P12782 [ICPC 2024 Yokohama R] E-Circuit Is Now on Sale!

· · 题解

根据题意可知最多会进行 n^2 次计算也就是最多 2500 次。

由于 n \leq 50,直接考虑暴力。

循环 n^2 次,每次循环枚举每个位置可否完成计算将结果传到下一个位置,每次循环枚举 n^2 次。合起来时间复杂度就是 O(n^4)。\

此外,需要注意运算过程中,数字的值在 $10^{18}$ 以内,不能用 `char` 来存,需要开一个布尔数组判断是否是数字,在输入过程中和枚举过程中都应注意哪些数据是数字。 遇到符号就判断旁边是否有符合其运算需求数字数量的数字,满足就运算,并把旁边删掉。 ```cpp #include<bits/stdc++.h> using namespace std; const int dx[4]={1,0,-1,0}; const int dy[4]={0,1,0,-1}; char a[55][55]; long long b[55][55]; bool digit[55][55]; int n,m; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if('0'<=a[i][j]&&a[i][j]<='9'){ digit[i][j]=true; b[i][j]=a[i][j]-'0'; } } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ for(int r=1;r<=n;r++){ for(int c=1;c<=m;c++){ if(a[r][c]=='#'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==1){ int x=r+dx[dire[0]],y=c+dy[dire[0]]; b[r][c]=b[x][y]; digit[x][y]=false; digit[r][c]=true; a[r][c]='.'; } }else if(a[r][c]=='+'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==2){ int x1=r+dx[dire[0]],y1=c+dy[dire[0]]; int x2=r+dx[dire[1]],y2=c+dy[dire[1]]; b[r][c]=b[x1][y1]+b[x2][y2]; digit[x1][y1]=digit[x2][y2]=false; digit[r][c]=true; a[r][c]='.'; } }else if(a[r][c]=='-'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==2){ int x1=r+dx[dire[0]],y1=c+dy[dire[0]]; int x2=r+dx[dire[1]],y2=c+dy[dire[1]]; b[r][c]=max(b[x1][y1],b[x2][y2])-min(b[x1][y1],b[x2][y2]); digit[x1][y1]=digit[x2][y2]=false; digit[r][c]=true; a[r][c]='.'; } }else if(a[r][c]=='*'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==2){ int x1=r+dx[dire[0]],y1=c+dy[dire[0]]; int x2=r+dx[dire[1]],y2=c+dy[dire[1]]; b[r][c]=b[x1][y1]*b[x2][y2]; digit[x1][y1]=digit[x2][y2]=false; digit[r][c]=true; a[r][c]='.'; } }else if(a[r][c]=='/'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==2){ int x1=r+dx[dire[0]],y1=c+dy[dire[0]]; int x2=r+dx[dire[1]],y2=c+dy[dire[1]]; b[r][c]=max(b[x1][y1],b[x2][y2])/min(b[x1][y1],b[x2][y2]); digit[x1][y1]=digit[x2][y2]=false; digit[r][c]=true; a[r][c]='.'; } }else if(a[r][c]=='P'){ vector<int> dire; int num=0; for(int k=0;k<4;k++){ int x=r+dx[k],y=c+dy[k]; if(x>=1&&x<=n&&y>=1&&y<=m&&digit[x][y]){ num++; dire.push_back(k); } } if(num==1){ int x1=r+dx[dire[0]],y1=c+dy[dire[0]]; cout<<b[x1][y1]; return 0; } } } } } } } ``` 码风不好,并且用了 `vector` ,而且好像很多地方是屎山,喷轻点。