题解:P12782 [ICPC 2024 Yokohama R] E-Circuit Is Now on Sale!
regular_heptagon
·
·
题解
根据题意可知最多会进行 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` ,而且好像很多地方是屎山,喷轻点。