[Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)
题目链接:http://acm.swust.edu.cn/problem/1126/
上一周里,患有XX症的哈特13成功解决了填数矩阵问题。
不知道他这一周又从哪儿弄来一神奇的矩阵,于是逃课潜心研究了一周,终于发现了其中的奥秘:
该矩阵有2行、4列,即8个小方块,每个小方块上有一个数字,即:
1 2 3 4
5 6 7 8
对于这个神奇的矩阵,有3种变换方式,具体如下:
变换A:上下两行数字互换,如上图可变为:
5 6 7 8
1 2 3 4
变换B:每行同时向右循环移动一格,如上图可变为:
4 1 2 3
8 5 6 7
变换C:中间4个方块顺时针旋转90度,如上图可变为:
1 6 2 4
5 7 3 8
哈特13虽然发现了这些变换规则,但是他并不知道怎么解决如下问题:
现在给出一个初始状态和目标状态,怎么变换才能使得矩阵从初始状态变为目标状态且变换步数最少。如果有多种变换方案,输出变换序号字典序最小的那种方案。
请你帮助他。
多组输入,约1000组,直到文件末尾。
每组数据包括4行,前两行为初始状态,后两行为目标状态。
对于每组输入,输出满足要求的变换方案。
1234
5678
5738
1624
|
CA |
- #include<iostream>
- #include<cstring>
- #include<string>
- #include<map>
- #include<queue>
- using namespace std;
- typedef struct{
- string path, mpt;
- }node;
- int vis[];
- int cur[] = { , , , , , , , , , };
- //依次为1的阶乘,2的阶乘。。。。。8各数在一个数位置确定时剩余 7! 种排列情况,以此类推
- string opera[];
- /******************************************
- 寻找对应状态下对应数字编号!!!!
- 查找 "当前数" 确定情况下剩下的 "排列"
- C(n 1)*(n-i)! 当前数状确定态下的排列种数, 依次递推到最后一位叠加,
- 每一个状态有且只有一个数对应
- *********************************************/
- int get_num(string x){
- int i, j, a, b, cnt = , book[];
- memset(book, , sizeof(book));
- for (i = ; i < ; i++){
- a = x[i] - '', b = ;
- for (j = ; j < a; j++){
- if (!book[j])
- b++;
- }
- cnt += b*cur[ - i];
- book[a] = ;
- }
- return cnt + ;
- }
- void bfs(){
- queue<node>Q;
- node now, next;
- now.mpt = "", now.path = "";
- Q.push(now);
- vis[get_num(now.mpt)] = ;
- while (!Q.empty()){
- now = Q.front();
- Q.pop();
- opera[get_num(now.mpt)] = now.path;
- for (int i = ; i < ; i++){
- next = now;
- if (!i){
- next.path += 'A';
- swap(next.mpt[], next.mpt[]);
- swap(next.mpt[], next.mpt[]);
- swap(next.mpt[], next.mpt[]);
- swap(next.mpt[], next.mpt[]);
- }
- else if (i == ){
- next.path += 'B';
- char s1 = next.mpt[];
- for (int j = ; j > ; j--)
- next.mpt[j] = next.mpt[j - ];
- next.mpt[] = s1;
- char s2 = next.mpt[];
- for (int j = ; j > ; j--)
- next.mpt[j] = next.mpt[j - ];
- next.mpt[] = s2;
- }
- else{
- next.path += 'C';
- swap(next.mpt[], next.mpt[]);
- swap(next.mpt[], next.mpt[]);
- swap(next.mpt[], next.mpt[]);
- }
- if (!vis[get_num(next.mpt)]){
- vis[get_num(next.mpt)] = ;
- Q.push(next);
- }
- }
- }
- }
- int main(){
- bfs();
- string x1, x2, y1, y2;
- while (cin >> x1 >> x2 >> y1 >> y2){
- x1 += x2, y1 += y2;
- pair<char, char>change[];
- for (int i = ; i <= ; i++){
- change[i].first = x1[i - ];
- change[i].second = i + '';
- }
- for (int i = ; i <= ; i++)
- for (int j = ; j <= ; j++){
- if (y1[i - ] == change[j].first){
- y1[i - ] = change[j].second;
- break;
- }
- }
- cout << opera[get_num(y1)] << "\r\n";
- //cout << y1;
- }
- return ;
- }
[Swust OJ 1126]--神奇的矩阵(BFS,预处理,打表)的更多相关文章
- [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)
题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
- [Swust OJ 715]--字典序问题(组合数预处理/数位dp)
题目链接:http://acm.swust.edu.cn/problem/715/ Time limit(ms): 1000 Memory limit(kb): 65535 在数据加密和数据压缩中 ...
- [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)
题目链接:http://acm.swust.edu.cn/problem/1125/ Time limit(ms): 1000 Memory limit(kb): 65535 Descriptio ...
- BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!
绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...
- bzoj2396: 神奇的矩阵
与51nod1140一样.不过这题是多组数据的...坑.... #include<cstdio> #include<cstring> #include<cctype> ...
- HDU 3567 Eight II BFS预处理
题意:就是八数码问题,给你开始的串和结束的串,问你从开始到结束的最短且最小的变换序列是什么 分析:我们可以预处理打表,这里的这个题可以和HDU1430魔板那个题采取一样的做法 预处理打表,因为八数码问 ...
- [Swust OJ 404]--最小代价树(动态规划)
题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Des ...
- [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)
题目链接:http://acm.swust.edu.cn/problem/649/ Time limit(ms): 1000 Memory limit(kb): 65535 Consider two ...
- 神奇的矩阵 NOI模拟题
神奇的矩阵 题目大意 有一个矩阵\(A\),第一行是给出的,接下来第\(x\)行,第\(y\)个元素的值为数字\(A_{x-1,y}\)在\(\{A_{x-1,1},A_{x-1,2},A_{x-1, ...
随机推荐
- mysql中随机取出几条数据
SELECT t1.id,title,extName,cover,url FROM shop_articles AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT M ...
- mapreduce 关于小文件导致任务缓慢的问题
小文件导致任务执行缓慢的原因: 1.很容易想到的是map task 任务启动太多,而每个文件的实际输入量很小,所以导致了任务缓慢 这个可以通过 CombineTextInputFormat,解决,主要 ...
- PHP_Yii框架_专辑<一>
一.PHP主流框架 cakephp—速度比较慢.CI(codeIgniter)—小型.symfony. TP(thinkphp)—国人开发.小型.zendframework(官方)—大型 Yii: 特 ...
- [LeetCode]题解(python):123-Best Time to Buy and Sell Stock III
题目来源: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/ 题意分析: 和上题类似,array[i]代表第i天物品 ...
- javascript Error对象详解
今天谈一下在IE浏览器下返回执行错误的Javascript代码所在的问题.其中在IE浏览器下,如果你使用了try-catch,那么当出现异常的时候,IE浏览器会传递一个Error对象. ~~~怎么通过 ...
- android怎样自定义设置下拉列表样式
图样: 实现方式: 1.水平布局一个TextView和一个ImageView(小黑箭头) 2.实现点击ImageView的单击事件,弹出PopupWindow 3.PopupWindow中实现下拉列表 ...
- ThinkPHP 3.1.2 模板中的基本语法<1>
# # ThinkPHP 3.1.2 模板中的基本语法 一.传统的方式,导入CSS和JS文件 1.css link js scr <link rel='stylesheet' type='tex ...
- POCO C++ lib开发环境构建
Welcome Thank you for downloading the POCO C++ Libraries and welcome to the growing community of POC ...
- POJ-1006 Biorhythms
[题目描述] 三个周期时间分别为:23,28和33.分别给定三个周期的某一天(不一定是第一天),和开始计算的日期,输出下一个triple peak. [思路分析] 如果不了解中国剩余定理,可以通过模拟 ...
- Mysql5.6.24 zip解压缩版配置及修改默认编码方法
win64位下载地址: http://dev.mysql.com/downloads/file.php?id=456319 下载完毕后解压 配置环境变量 在Path后加上mysql解压后bin文件夹所 ...