专栏文章
题解:P12782 [ICPC 2024 Yokohama R] E-Circuit Is Now on Sale!
P12782题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minus4in
- 此快照首次捕获于
- 2025/12/02 08:41 3 个月前
- 此快照最后确认于
- 2025/12/02 08:41 3 个月前
根据题意可知最多会进行 次计算也就是最多 次。
由于 ,直接考虑暴力。
循环 次,每次循环枚举每个位置可否完成计算将结果传到下一个位置,每次循环枚举 次。合起来时间复杂度就是 。
的数量级,并不会超时。
的数量级,并不会超时。
此外,需要注意运算过程中,数字的值在 以内,不能用
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 ,而且好像很多地方是屎山,喷轻点。相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...