飞行兄弟【二进制枚举+异或】
看到这题就知道要暴力枚举,然后就用二进制枚举,用整数来表示对应十字架的状态,也就是2的幂次。
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 int a[5][5]; 8 int change[5][5]; 9 int get(int x, int y){return x * 4 + y;} 10 int main(){ 11 int state = 0; 12 for(int i = 0; i < 4; ++ i) 13 for(int j = 0; j < 4; ++ j){ 14 char c; 15 cin >> c; 16 if(c == '+') 17 state += 1 << get(i,j);//这时起始状态 18 } 19 for(int i = 0; i < 4; ++ i)//用来存异或后的状态 20 for(int j = 0; j <4; ++ j){ 21 for(int k = 0; k < 4; ++ k){ 22 change[i][j] += 1 << get(i, k); 23 change[i][j] += 1 << get(k, j); 24 } 25 change[i][j] -= 1 << get(i, j);//加了两次减去一次 26 } 27 vector<pair<int, int> >res;//存答案 28 for(int i = 0; i < 1 << 16; ++ i){//枚举状态0101,1表示要打开,0表示补打开 29 int now = state; 30 vector<pair<int,int> > path; 31 for(int j = 0; j < 16; ++ j) 32 if(i >> j & 1){//取出第j位二进制数 33 int x = j / 4, y = j % 4; 34 now ^= change[x][y]; 35 path.push_back({x,y}); 36 } 37 if(!now && (res.empty()||res.size() > path.size())) res = path; 38 } 39 cout << res.size() << endl; 40 for(auto i : res) cout << i.first + 1 << " " << i.second + 1 << endl; 41 return 0; 42 }
追求吾之所爱
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· PPT革命!DeepSeek+Kimi=N小时工作5分钟完成?
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 赶AI大潮:在VSCode中使用DeepSeek及近百种模型的极简方法
· DeepSeek企业级部署实战指南:从服务器选型到Dify私有化落地