博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hihocoder编程练习赛52-2 亮灯方案
阅读量:5281 次
发布时间:2019-06-14

本文共 1505 字,大约阅读时间需要 5 分钟。

思路:

状态压缩dp。

实现:

1 #include 
2 using namespace std; 3 typedef long long ll; 4 const int MAXN = 22; 5 const int dx[4] = {
0, 1, -1, 0}; 6 const int dy[4] = {
1, 0, 0, -1}; 7 int n, m; 8 ll dp[(1 << 20) + 5]; 9 char a[MAXN][MAXN], tmp[MAXN][MAXN];10 bool check(int x, int y, int S)11 {12 for (int i = 0; i < 4; i++)13 {14 int nx = x + dx[i], ny = y + dy[i];15 if (nx >= 0 && nx < n && ny >= 0 && ny < m && (S & (1 << (nx * m + ny))))16 return true;17 }18 return false;19 }20 ll dfs(int now, int S)21 {22 if (dp[S] != -1) return dp[S];23 if (now == n * m) return 1;24 ll cnt = 0;25 for (int i = 0; i < n; i++)26 {27 for (int j = 0; j < m; j++)28 {29 int x = i * m + j;30 if (!(S & (1 << x)) && check(i, j, S))31 cnt += dfs(now + 1, S | (1 << (i * m + j)));32 }33 }34 return dp[S] = cnt;35 }36 37 int main()38 {39 cin >> n >> m;40 int now = 0, S = 0;41 for (int i = 0; i < n; i++)42 for (int j = 0; j < m; j++)43 cin >> a[i][j];44 for (int i = 0; i < n; i++)45 {46 for (int j = 0; j < m; j++)47 {48 if (a[i][j] == '1') 49 {50 now++;51 S |= (1 << i * m + j);52 }53 }54 } 55 memset(dp, -1, sizeof dp);56 cout << dfs(now, S) << endl;57 return 0;58 }

 

转载于:https://www.cnblogs.com/wangyiming/p/8644813.html

你可能感兴趣的文章
jQuery之end()和pushStack()
查看>>
Bootstrap--响应式导航条布局
查看>>
Learning Python 009 dict(字典)和 set
查看>>
JavaScript中随着鼠标拖拽而移动的块
查看>>
HDU 1021 一道水题
查看>>
The operation couldn’t be completed. (LaunchServicesError error 0.)
查看>>
php每天一题:strlen()与mb_strlen()的作用分别是什么
查看>>
工作中收集JSCRIPT代码之(下拉框篇)
查看>>
《转载》POI导出excel日期格式
查看>>
code异常处理
查看>>
git - 搭建最简单的git server
查看>>
会话控制
查看>>
推荐一款UI设计软件Balsamiq Mockups
查看>>
Linux crontab 命令格式与详细例子
查看>>
百度地图Api进阶教程-地图鼠标左右键操作实例和鼠标样式6.html
查看>>
游标使用
查看>>
LLBL Gen Pro 设计器使用指南
查看>>
SetCapture() & ReleaseCapture() 捕获窗口外的【松开左键事件】: WM_LBUTTONUP
查看>>
Android 设置界面的圆角选项
查看>>
百度地图api服务端根据经纬度得到地址
查看>>