洛谷 P1123 取数游戏 (又是写了好久 最后还是无奈看了题解……)
对于这个题感觉是一个比较典型的dfs.本题的状态是 对于每个数字你可以选也可以不选,但是一旦你选定某个数字之后,他会对其周围的数字产生影响所以一定要标记好(注意这里标记的时候不能用 布尔数组 一定要用一个整形的数组,因为可能出现两个数中间的数本来不应该选但是最后选上的错误)
例如:
当单步运行的时候如果到了 选10,然后它会继续堆zhai,然后出zhai,如果取17过后,再复原的时候,3对应的类型就会变成 false,所以也就会把3选上 但是这样是不对的。所以,我们要利用整形的数组。
接下来的难点就是怎样去遍历了,这一点没啥好说的 因为我也是看题解的。题解大佬是 先对列进行遍历,然后换行,到最后一个点的时候就返回。
接下来就是 对于每个数 取和不取的两种状态:
完整的代码如下:
#include<iostream> #include<math.h> using namespace std; int a[8][8]; int b[8][8]; int p,q; const int d[8][2]={1,0,-1,0,0,1,0,-1,1,1,-1,1,1,-1,-1,-1}; //int d_x[8] = {0,0,1,1,1,-1,-1,-1}; //int d_y[8] = {1,-1,0,1,-1,0,-1,1}; int sum,sm; int max(int x,int y) { return (x > y) ? x : y; } void dfs(int m,int n){ if(n == q+1) { dfs(m+1,1); return; } if(m == p+1) { sum = max(sum,sm); return; } dfs(m,n+1); // 不取数字 if(b[m][n] == 0){ //不能用布尔数组 会重叠 sm += a[m][n]; for(int i = 0;i < 8;i++){ b[m + d[i][0]][n + d[i][1]]++; } dfs(m,n+1); //取这个数字 sm -= a[m][n]; for(int i = 0;i < 8;i++){ b[m + d[i][0]][n + d[i][1]]--; } } } int main(){ int n; cin>>n; while(n--){ cin>>p>>q; for(int i = 1;i <= p;i++) for(int j = 1;j <= q;j++) cin>>a[i][j]; sum = 0; dfs(1,1); cout<<sum<<endl; } return 0; }
okok 加油小灰灰 加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
分类:
菜鸟小灰之dfs
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具