#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int m,n,s,x,start1,end1;
int f[105][30];
char a1[10],b1[10],c1[10],d1[10];
struct node{
int id=0,s1,s2,e1,e2;
}vis[102][28];
int change(char str[10]){
if('0'<=str[2]&&str[2]<='9'){
if('0'<=str[3]&&str[3]<='9'){
start1=100*(str[1]-'0')+10*(str[2]-'0')+(str[3]-'0');
}else{
start1=10*(str[1]-'0')+(str[2]-'0');
}
}else{
start1=(str[1]-'0');
}
return start1;
}
int dfs(int a,int b){
if(vis[a][b].id==0) return f[a][b];
else if(vis[a][b].id==1){
int sum=0;
for(int i=vis[a][b].s1;i<=vis[a][b].e1;i++){
for(int j=vis[a][b].s2;j<=vis[a][b].e2;j++){
sum+=dfs(i,j);
}
}
return sum;
}else{
int sum=0,k=0;
for(int i=vis[a][b].s1;i<=vis[a][b].e1;i++){
for(int j=vis[a][b].s2;j<=vis[a][b].e2;j++){
sum+=dfs(i,j);
k++;
}
}
return sum/k;
}
}
int main(){
scanf("%d%d%d",&m,&n,&s);
for(int t=1;t<=s;t++){
scanf("%s",a1);
scanf("%s",d1);
if(d1[0]=='i') {
scanf("%d",&x);
f[change(a1)][a1[0]-'A'+1]=x;
}else if(d1[0]=='o'){
printf("%d\n",dfs(change(a1),a1[0]-'A'+1));
}else if(d1[0]=='s'){
scanf("%s",b1);
scanf("%s",c1);
vis[change(a1)][a1[0]-'A'+1]={1,change(b1),b1[0]-'A'+1,change(c1),c1[0]-'A'+1};
}else{
scanf("%s",b1);
scanf("%s",c1);
vis[change(a1)][a1[0]-'A'+1]={2,change(b1),b1[0]-'A'+1,change(c1),c1[0]-'A'+1};
}
}
return 0;
}
2 个赞
根据题目描述,我们可以进行如下修改:
- 题目给出的数据范围是m≤26,n≤100,s≤100,因此我们需要按照题目要求定义对应的数组大小。可以将f数组的大小修改为f[105][105],vis数组的大小修改为vis[105][105]。
- 需要修改change函数,以便正确处理单元格位置的表示。修改后的change函数代码如下:
int change(char str[10]){ int start1; if('0'<=str[2]&&str[2]<='9'){ if('0'<=str[3]&&str[3]<='9'){ start1=100*(str[1]-'0')+10*(str[2]-'0')+(str[3]-'0'); }else{ start1=10*(str[1]-'0')+(str[2]-'0'); } }else{ start1=(str[1]-'0'); } return start1; }
- 修改dfs函数中的遍历范围。将vis[a][b].e1修改为vis[a][b].e1+1,将vis[a][b].e2修改为vis[a][b].e2+1。修改后的代码如下:
int dfs(int a,int b){ if(vis[a][b].id==0) return f[a][b]; else if(vis[a][b].id==1){ int sum=0; for(int i=vis[a][b].s1;i<vis[a][b].e1+1;i++){ for(int j=vis[a][b].s2;j<vis[a][b].e2+1;j++){ sum+=dfs(i,j); } } return sum; }else{ int sum=0,k=0; for(int i=vis[a][b].s1;i<vis[a][b].e1+1;i++){ for(int j=vis[a][b].s2;j<vis[a][b].e2+1;j++){ sum+=dfs(i,j); k++; } } return sum/k; } }
- 在主函数main中进行相应的修改: • 修改输入的第一行,读取m和n的值。 • 修改f数组的大小为f[105][105]。 • 修改vis数组的大小为vis[105][105]。 • 在输出操作的地方,将结果输出到标准输出而不是直接打印出来。 修改后的main函数代码如下: int main(){
int m, n, s; scanf("%d%d%d", &m, &n, &s); memset(f, 0, sizeof(f)); memset(vis, 0, sizeof(vis)); for(int t=1;t<=s;t++){ scanf("%s",a1); scanf("%s",d1); if(d1[0]=='i') { scanf("%d",&x); f[change(a1)][a1[0]-'A'+1]=x; }else if(d1[0]=='o'){ printf("%d\n",dfs(change(a1),a1[0]-'A'+1)); }else if(d1[0]=='s'){ scanf("%s",b1); scanf("%s",c1); vis[change(a1)][a1[0]-'A'+1]={1,change(b1),b1[0]-'A'+1,change(c1),c1[0]-'A'+1}; }else{ scanf("%s",b1); scanf("%s",c1); vis[change(a1)][a1[0]-'A'+1]={2,change(b1),b1[0]-'A'+1,change(c1),c1[0]-'A'+1}; } } return 0; }
请注意,修改后的代码只是部分修改,仅修改了与题目要求相关的部分。其他代码保持不变。如果有其他需求或问题,请提出。
由ChatGPT Sidebar(ChatGPT 3.5)回答
3 个赞
试试看也许可以~
2 个赞
你说的很长,看着很有道理,可是改完之后似乎还是紫的
2 个赞
这……………………………………………………………………………………………………………………
2 个赞
我建议你从头开始做,相信我,会有新发现的
你会发现你又浪费了很多时间,且不紫了
1 个赞