当前位置: 首页 > news >正文

CSP202512C. 图片解码 100分做法

图片解码 - 题目详情 - 曙梦(水木清研)OJ

75分做法,调试了比较久

#include<iostream> #include<vector> using namespace std; #define N 405 char jz[N][N]; int z=0,deg=0; //顺时针的 int hash1(int i,int j){ int d=deg; if(d==0){ return i; }else if(d==90){ return j; }else if(d==180){ return z-i+1; }else { return z-j+1; } } int hash2(int i,int j){ int d=deg; if(d==0){ return j; }else if(d==90){ return z-i+1; }else if(d==180){ return z-j+1; }else { return i; } } // 传入虚拟坐标(r, c),返回物理矩阵中对应元素的引用 char& get_val(int r, int c){ return jz[hash1(r,c)][hash2(r,c)]; } void out(){ cout<<"================="<<endl; for(int i=1;i<=z;i++){ for(int j=1;j<=z;j++){ cout<<jz[i][j]; }cout<<endl; } cout<<endl; } void fz(int u,int d,int l,int r,int o){ //u-d 1 i //l-r 2 j //o=-1 左右 if(o==-1){ //cout<<"zuoyou fanzhuan: "<<u<<" ~ "<<d<<" hang; "<<l<<" ~ "<<r<<" lie\n"; for(int i=u;i<=d;i++){ int left=l,right=r; for(int j=1;j<=(r-l+1)/2;j++){ swap(jz[hash1(i,j)][hash2(left,j)],jz[hash1(i,j)][hash2(right,j)]); left+=1,right-=1; } } //out(); }else{ //cout<<"shangxia fanzhuan: "<<u<<" ~ "<<d<<" hang; "<<l<<" ~ "<<r<<" lie\n"; //o=1 上下 for(int j=l;j<=r;j++){ int up=u,down=d; for(int i=1;i<=(d-u+1)/2;i++){ swap(jz[hash1(up,j)][hash2(i,j)],jz[hash1(down,j)][hash2(i,j)]); up+=1,down-=1; } } //out(); } } void ssz(int u,int v,int l,int d){ //cout<<"zuobiao"<<"( "<<u<<" , "<<v<<" ) "<<"changdu "<<l<<" -- "; //u 1 i //v 2 j if(d==0) { return; }else if(d==90){ //转置再按照纵轴镜像 for(int i=1;i<=l;i++){ for(int j=1;j<i;j++){ swap(jz[hash1(u,v)+hash1(i,j)-1][hash2(u,v)+hash2(i,j)-1],jz[hash1(u,v)+hash2(i,j)-1][hash2(u,v)+hash1(i,j)-1]); } } //1不变 for(int i=1;i<=l;i++){ int left=v,right=v+l-1;//up=v,down=v+l-1; for(int j=1;j<=l/2;j++){ swap(jz[hash1(u+i-1,left)][hash2(u+i-1,left)],jz[hash1(u+i-1,right)][hash2(u+i-1,right)]); left+=1,right-=1; } } //cout<<"90: ~~~~~~~~~~~~~\n"; //out(); }else if(d==180){ //纵轴镜像 横轴镜像 for(int i=1;i<=l;i++){ int left=v,right=v+l-1;//up=v,down=v+l-1; for(int j=1;j<=l/2;j++){ swap(jz[hash1(u+i-1,left)][hash2(u+i-1,left)],jz[hash1(u+i-1,right)][hash2(u+i-1,right)]); left+=1,right-=1; } } // 横轴镜像 for(int i=1;i<=l;i++){ for(int j=1;j<i;j++){ swap(jz[hash1(u,v)+hash1(i,j)-1][hash2(u,v)+hash2(i,j)-1],jz[hash1(u,v)+hash2(i,j)-1][hash2(u,v)+hash1(i,j)-1]); } } //cout<<"180: ~~~~~~~~~~~~~\n"; //out(); }else{ //转置 横轴镜像 for(int i=1;i<=l;i++){ for(int j=1;j<i;j++){ swap(jz[hash1(u,v)+hash1(i,j)-1][hash2(u,v)+hash2(i,j)-1],jz[hash1(u,v)+hash2(i,j)-1][hash2(u,v)+hash1(i,j)-1]); } } for(int j=1;j<=l;j++){ int up=u,down=u+l-1; for(int i=1;i<=l/2;i++){ swap(jz[hash1(up,v+j-1)][hash2(up,v+j-1)],jz[hash1(down,v+j-1)][hash2(down,v+j-1)]); up+=1,down-=1; } } //cout<<"270: ~~~~~~~~~~~~~\n"; //out(); } } struct fin{ int o1,o2,o3,o4,o5,o6; }; vector<fin> cz; void in(){ int op,u,d,l,r,o; //操作存储 cin>>op>>u>>d>>l>>r>>o; cz.push_back({op,u,d,l,r,o}); } void solve(fin& f){ int op,u,d,l,r,o; //操作存储 op=f.o1,u=f.o2,d=f.o3,l=f.o4,r=f.o5,o=f.o6; //cin>>op>>u>>d>>l>>r>>o; if(op==2){ fz(u,d,l,r,o); } else { int ui,vi,li,di,ri; ui=u,vi=d,li=l,di=r,ri=o; //ssz(1,1,z,ri*90);//需要优化这里做映射 deg=(deg+ri*90)%360; int nszd=(-di+360)%360; ssz(ui,vi,li,nszd); //cout<<sszd<<endl; } //out(); } int m,n; void searchmn(){ n=z,m=z; for(int j=1;j<=z;j++){ if(jz[1][j]=='?'){ n=j-1; break; } } for(int i=1;i<=z;i++){ if(jz[i][1]=='?'){ m=i-1; break; } } } void res(){ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ cout<<jz[i][j]; }cout<<endl; } } int main(){ freopen("3.in","r",stdin); freopen("3.out","w",stdout); cin>>z; for(int i=1;i<=z;i++){ for(int j=1;j<=z;j++){ char ch; cin>>ch; jz[i][j]=ch; } } //定义操作序列 //out(); int k; cin>>k; int t; cin>>t; int ct=t; while(ct--){ in(); } for(auto p=cz.rbegin();p!=cz.rend();p++){ fin f=*p; solve(f); } //out(); searchmn(); cout<<m<<' '<<n<<endl; res(); return 0; }

100分代码,Gemini加了坐标映射,注意映射是正向生成还是逆向反推,中间差了360-x度

#include<iostream> #include<vector> using namespace std; #define N 405 char jz[N][N]; int z=0,deg=0; int n,m; //顺时针的 int hash1(int i,int j){ int d=deg; if(d==0){ return i; }else if(d==90){ return j; }else if(d==180){ return z-i+1; }else { return z-j+1; } } int hash2(int i,int j){ int d=deg; if(d==0){ return j; }else if(d==90){ return z-i+1; }else if(d==180){ return z-j+1; }else { return i; } } // 传入虚拟坐标(r, c),返回物理矩阵中对应元素的引用 char& get_val(int r, int c){ return jz[hash1(r,c)][hash2(r,c)]; } void out(){ cout<<"================="<<endl; for(int i=1;i<=z;i++){ for(int j=1;j<=z;j++){ // 最终输出同样需要戴着“VR眼镜”读取 cout << get_val(i, j); } cout << endl; } } void res(){ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ // 最终输出同样需要戴着“VR眼镜”读取 cout << get_val(i, j); } cout << endl; } } void fz(int u,int d,int l,int r,int o){ if(o==-1){ for(int i=u;i<=d;i++){ int left=l,right=r; for(int j=1;j<=(r-l+1)/2;j++){ // 完美替换,逻辑极度清晰 swap(get_val(i, left), get_val(i, right)); left+=1,right-=1; } } }else{ for(int j=l;j<=r;j++){ int up=u,down=d; for(int i=1;i<=(d-u+1)/2;i++){ swap(get_val(up, j), get_val(down, j)); up+=1,down-=1; } } } } void ssz(int u,int v,int l,int d){ if(d==0) { return; }else if(d==90){ for(int i=1;i<=l;i++){ for(int j=1;j<i;j++){ swap(get_val(u+i-1, v+j-1), get_val(u+j-1, v+i-1)); } } for(int i=1;i<=l;i++){ int left=v,right=v+l-1; for(int j=1;j<=l/2;j++){ swap(get_val(u+i-1, left), get_val(u+i-1, right)); left+=1,right-=1; } } }else if(d==180){ // 横向翻转 for(int i=1;i<=l;i++){ int left=v,right=v+l-1; for(int j=1;j<=l/2;j++){ swap(get_val(u+i-1, left), get_val(u+i-1, right)); left+=1,right-=1; } } // 纵向翻转 for(int j=1;j<=l;j++){ int up=u,down=u+l-1; for(int i=1;i<=l/2;i++){ swap(get_val(up, v+j-1), get_val(down, v+j-1)); up+=1,down-=1; } } }else{ for(int i=1;i<=l;i++){ for(int j=1;j<i;j++){ swap(get_val(u+i-1, v+j-1), get_val(u+j-1, v+i-1)); } } for(int j=1;j<=l;j++){ int up=u,down=u+l-1; for(int i=1;i<=l/2;i++){ swap(get_val(up, v+j-1), get_val(down, v+j-1)); up+=1,down-=1; } } } //out(); } void searchmn(){ n=z,m=z; for(int j=1;j<=z;j++){ // 找边界也要用虚拟坐标去读! if(get_val(1, j) == '?'){ n=j-1; break; } } for(int i=1;i<=z;i++){ if(get_val(i, 1) == '?'){ m=i-1; break; } } } struct fin{ int o1,o2,o3,o4,o5,o6; }; vector<fin> cz; void in(){ int op,u,d,l,r,o; //操作存储 cin>>op>>u>>d>>l>>r>>o; cz.push_back({op,u,d,l,r,o}); } void solve(fin& f){ int op,u,d,l,r,o; //操作存储 op=f.o1,u=f.o2,d=f.o3,l=f.o4,r=f.o5,o=f.o6; //cin>>op>>u>>d>>l>>r>>o; if(op==2){ fz(u,d,l,r,o); } else { int ui,vi,li,di,ri; ui=u,vi=d,li=l,di=r,ri=o; //ssz(1,1,z,ri*90);//需要优化这里做映射 deg=(deg+ri*270)%360; int nszd=(-di+360)%360; ssz(ui,vi,li,nszd); //cout<<sszd<<endl; } //out(); } int main(){ //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); cin>>z; for(int i=1;i<=z;i++){ for(int j=1;j<=z;j++){ char ch; cin>>ch; jz[i][j]=ch; } } //定义操作序列 //out(); int k; cin>>k; int t; cin>>t; int ct=t; while(ct--){ in(); } for(auto p=cz.rbegin();p!=cz.rend();p++){ fin f=*p; solve(f); } //out(); searchmn(); cout<<m<<' '<<n<<endl; res(); return 0; }
http://www.jsqmd.com/news/542918/

相关文章:

  • 优化算法避坑指南:为什么你的梯度下降总跑出可行域?聊聊可行方向与投影的妙用
  • Ostrakon-VL-8B模型剪枝与量化入门:降低部署资源消耗
  • 如何用winget-install解决Windows软件安装难题?
  • DDColor季节变换:单图生成四季效果
  • YOLOv10镜像实测:一键部署,快速体验无后处理目标检测
  • 基于springboot框架的课程实验教学项目管理系统的设计与实现
  • ContextMenuManager:3个步骤快速清理Windows右键菜单的终极工具
  • MySQL增删改查基础操作指南
  • 海豚调度器单机版快速上手:3分钟搞定开发环境搭建(附常见问题排查)
  • SEO_如何制定有效的SEO策略?分步指南详解
  • 你的Mac需要「滚动方向分离器」吗?告别设备切换的混乱体验
  • Navicat操作MySQL:CRUD全攻略
  • 实战指南:如何用GeoIP2和IP2Location搭建本地IP归属地查询服务(附免费数据库下载)
  • League-Toolkit:英雄联盟玩家的终极智能助手,三步实现战力全面升级
  • SFFNet:从频域到空间域,解锁遥感图像分割的灰度变化难题
  • nextTick 是 Vue 提供的全局 API,用于在下一次 DOM 更新完成后执行回调函数
  • OpenClaw未来展望:Qwen3.5-4B-Claude在个人自动化中的潜力
  • 新手别怕!用Logisim从零搭建交通灯系统(Educoder数字逻辑实验保姆级通关指南)
  • 别再只盯着Stegsolve了!聊聊CTF中那些“非典型”隐写术:以MP3和像素点二维码为例
  • 猫头虎AI赠书第12期赠书活动:《扣子Skills+OpenClaw实战:零基础玩转AI智能体》
  • 南北阁 4.1-3B 开源镜像实战:Streamlit轻量化UI+CoT折叠展示一文详解
  • 精读《Harness design for long-running application development》:真正拉开差距的,不是模型本身,而是你怎么给它harness
  • 给Claude Code装上“外挂”:一文看懂它的扩展生态
  • 告别树莓派缺货烦恼:手把手教你用MKS PI V1.0搭建Klipper 3D打印服务器(Armbian系统)
  • 告别塑料脸!BEYOND REALITY Z-Image一键部署,生成8K级真实人像
  • 2026年寄易碎品选什么快递好?实用选择指南 - 品牌排行榜
  • Llama-3.2V-11B-cot效果分享:模型对图像隐含逻辑矛盾的识别能力
  • 2026年哪家快递不容易丢件?用户真实选择参考 - 品牌排行榜
  • ThreadLocal 详解
  • 从ORA-600到闪回技术:Oracle错误代码背后的架构设计启示录