LightOJ 1061 1061 - N Queen Again(状压dp)
来源:互联网 发布:淘宝云客服靠谱吗 编辑:程序博客网 时间:2024/05/16 12:20
题意:
给定一个8∗8棋盘有8个皇后,问最少移动多少步可以使得皇后不互相攻击,移动的时候可以移动8个方向,但是皇后不能互相跨越
分析:
如果暴力移动的话,然后判断终态是否合法,复杂度非常高,但是我们提前预处理出所有8皇后的解的方案,只有92种
然后跑带权匹配就可以了,这里用状压dp就可以
问题来了,权值如何计算呢,有一个转化,皇后不能互相跨越这个条件其实是没用的,可以等价为先移动阻挡的皇后,两种需要的步数是一样的
问题解决,复杂度为O(92∗82∗28)
代码:
//// Created by TaoSama on 2015-12-10// Copyright (c) 2015 TaoSama. All rights reserved.////#pragma comment(linker, "/STACK:1024000000,1024000000")#include <algorithm>#include <cctype>#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <iomanip>#include <iostream>#include <map>#include <queue>#include <string>#include <set>#include <vector>using namespace std;#define pr(x) cout << #x << " = " << x << " "#define prln(x) cout << #x << " = " << x << endlconst int N = 1e5 + 10, INF = 0x3f3f3f3f, MOD = 1e9 + 7;typedef pair<int, int> Point;int vis[3][20]; //column, main, vice diagonalPoint goal[8], s[8];int ans, g[8][8], f[10][1 << 8];int get(int i, int j) { if(s[i].first == goal[j].first && s[i].second == goal[j].second) return 0; if(s[i].first == goal[j].first || s[i].second == goal[j].second) return 1; if(s[i].first - s[i].second == goal[j].first - goal[j].second) return 1; if(s[i].first + s[i].second == goal[j].first + goal[j].second) return 1; return 2;}void gao() { for(int i = 0; i < 8; ++i) for(int j = 0; j < 8; ++j) g[i][j] = get(i, j); memset(f, 0x3f, sizeof f); f[0][0] = 0; for(int i = 0; i < 8; ++i) { for(int j = 0; j < 1 << 8; ++j) { if(f[i][j] == INF) continue; for(int k = 0; k < 8; ++k) { if(j >> k & 1) continue; f[i + 1][j | 1 << k] = min(f[i + 1][j | 1 << k], f[i][j] + g[i][k]); } } } ans = min(ans, f[8][(1 << 8) - 1]);}void dfs(int row) { if(row == 8) { gao(); return; } for(int i = 0; i < 8; ++i) { if(vis[0][i] || vis[1][row - i + 8] || vis[2][row + i]) continue; goal[row] = Point(row, i); vis[0][i] = vis[1][row - i + 8] = vis[2][row + i] = 1; dfs(row + 1); vis[0][i] = vis[1][row - i + 8] = vis[2][row + i] = 0; }}int main() {#ifdef LOCAL freopen("C:\\Users\\TaoSama\\Desktop\\in.txt", "r", stdin);// freopen("C:\\Users\\TaoSama\\Desktop\\out.txt","w",stdout);#endif ios_base::sync_with_stdio(0); int t; scanf("%d", &t); int kase = 0; while(t--) { int idx = 0; for(int i = 0; i < 8; ++i) { char buf[10]; scanf("%s", buf); for(int j = 0; j < 8; ++j) if(buf[j] == 'q') s[idx++] = Point(i, j); } ans = INF; dfs(0); printf("Case %d: %d\n", ++kase, ans); } return 0;}
0 0
- LightOJ 1061 N Queen Again(状压DP)
- LightOJ 1061 1061 - N Queen Again(状压dp)
- LightOJ - 1061 N Queen Again(状压DP)
- LightOJ 1061N Queen Again(搜索+状压DP)
- lightoj 1061 - N Queen Again
- Light OJ 1061 - N Queen Again(搜索+状压DP)
- lightoj1061 (N Queen Again)搜索+状压dp
- Light OJ 1061 N Queen Again
- LightOJ 1061(n皇后)
- LightOJ 1038 - Race to 1 Again(dp)
- LightOJ 1038 - Race to 1 Again (期望dp)
- LightOJ-1038-Race to 1 Again(概率dp)
- N-Queen(java实现)
- LightOJ 1038 - Race to 1 Again 【DP】
- N queen
- N-queen
- N-Queen
- N-Queen
- 【Unity】脚本选择打勾的勾选框隐藏
- Android学习笔记(12):表格布局TableLayout
- jquery点击toggle并改变图片src源码
- node包管理器npm 学习笔记(5)
- UVA 题目401 - Palindromes JAVA版
- LightOJ 1061 1061 - N Queen Again(状压dp)
- 计算机:下一代人机交互平台荐4股
- 简简单单搞掂恼人的Laravel 5安装
- sql server 开xp_cmdhshell
- casio计算器计算统计数据
- Java 树形 数据 合并单元格导出Excel
- Linux-CentOS Elasticsearch Clients客户端集合
- Linux 如何定位占用进程并杀掉占用端口号进程
- php数据库数据转换为js中的json对象