当前位置: 首页 > news >正文

绍兴网站建设哪好百度网盘官网登录首页

绍兴网站建设哪好,百度网盘官网登录首页,wordpress搬家修改域名,做风险投资网站题目链接:The Rotation Game 题目描述: 给定二十四个整数,这二十四个整数由八个一,八个二,八个三组成,从左到右,从上到下依次描述下图方格中的数字: 例如上图左边对应的输入就是[1,…

题目链接:The Rotation Game
题目描述:

给定二十四个整数,这二十四个整数由八个一,八个二,八个三组成,从左到右,从上到下依次描述下图方格中的数字:
在这里插入图片描述
例如上图左边对应的输入就是[1,1,1,1,3,2,3,2,3,1,3,2,2,3,1,2,2,2,3,1,2,1,3,3][1, 1, 1, 1, 3, 2, 3, 2, 3, 1, 3, 2, 2, 3, 1, 2, 2, 2, 3, 1, 2, 1, 3, 3][1,1,1,1,3,2,3,2,3,1,3,2,2,3,1,2,2,2,3,1,2,1,3,3]。你每一次可以进行A−HA-HAH八种操作,上图给出了AAA操作和CCC操作如何进行,其他的操作如何进行可以类似的推出,你的任务是找到最少的操作步数让中间的八个数字为同一个数字,例如上图左边经过两次操作能将中间全部变成222,如果有多个解,那么你需要输出字典序最小的解,同时你还需要输出中间的数字。

题解:

本题可以使用IDA∗(IterativeDeepeningAStar)IDA*(Iterative Deepening A Star)IDA(IterativeDeepeningAStar)算法,直接依次枚举进行的操作(需要注意的是,应该先枚举字典序小的),很明显可以发现,每一次移动最多只会让中间的位置正确的数字个数增加一,所以可以考虑的剪枝是:最大深度与当前深度之差如果小于中间最少的不对的数字时进行剪枝。
当然本题还有其他的做法。
本题也可以通过BFSBFSBFS来做,不过使用BFSBFSBFS来解决本题的时候,我们可以转换一下思路,我们可以把目标状态能够到达的所有其他状态枚举出来,这样的花费与从某个状态到目标状态是一样的。但是这样枚举存在一个问题:时间复杂度过高。
时间复杂度如何计算?要计算时间复杂度也就是计算所有可能的状态,也就是计算242424个数字,这242424个数字含有三种数字,每种数字的个数均为888的排列个数,那么根据高中的组合数学知识,我们可以知道可能的排列个数为24!8!8!8!\frac {24!} {8!8!8!}8!8!8!24!,这个数字是比较大的。不过我们有新的方法,因为只需要中间的八个数字相同,我们可以依次枚举中间可能的数字(这里是1,2,31, 2, 31,2,3),不同于中间可能的数字记为000,这样可能状态数量就变成了242424个数字包含两种数字,其中一种数字的个数是888,另一个种数字的个数是161616的排列个数,那么此时的排列个数变成了24!8!16!\frac {24!} {8!16!}8!16!24!此时的复杂度就到了可以接受的范围了。我们在BFSBFSBFS完成之后可以不用存储每一次的路径,而是在后续来还原出路径,这样可以节省一定的空间开销,还原的过程类似于BFSBFSBFS的过程,只是还原的时候只会访问最佳的路径,而不是所有的路径。同时在BFSBFSBFS的时候,由于在队列中放入一个数组非常不好处理,所以我们需要将状态进行编码,由于一共只有242424个状态,那么我们可以用242424位的二进制数来表示每一个位置的状态。
经过测试IDA∗IDA*IDA速度要快得多。

IDA*代码:

#include <bits/stdc++.h>using namespace std;int g[24];
vector<char> ans;// 数据的下标 6 7 8 11 12 15 16 17为中间的八个数字
// 返回最少需要几个数字让中间八个数字相同
int getWrongPos()
{int cnt[4] = {0};cnt[g[6]]++;cnt[g[7]]++;cnt[g[8]]++;cnt[g[11]]++;cnt[g[12]]++;cnt[g[15]]++;cnt[g[16]]++;cnt[g[17]]++;return 8 - max(cnt[1], max(cnt[2], cnt[3]));
}void move(int op)
{int temp = 0;switch(op) {case 0:temp = g[0];g[0] = g[2];g[2] = g[6];g[6] = g[11];g[11] = g[15];g[15] = g[20];g[20] = g[22];g[22] = temp;break;case 1:temp = g[1];g[1] = g[3];g[3] = g[8];g[8] = g[12];g[12] = g[17];g[17] = g[21];g[21] = g[23];g[23] = temp;break;case 2:temp = g[10];for (int i = 10; i >= 5; i--) { g[i] = g[i - 1]; }g[4] = temp;break;case 3:temp = g[19];for (int i = 19; i >= 14; i--) { g[i] = g[i - 1]; }g[13] = temp;break;case 4:temp = g[23];g[23] = g[21];g[21] = g[17];g[17] = g[12];g[12] = g[8];g[8] = g[3];g[3] = g[1];g[1] = temp;break;case 5:temp = g[22];g[22] = g[20];g[20] = g[15];g[15] = g[11];g[11] = g[6];g[6] = g[2];g[2] = g[0];g[0] = temp;break;case 6:temp = g[13];for (int i = 13; i <= 18; i++) { g[i] = g[i + 1]; }g[19] = temp;break;case 7:temp = g[4];for (int i = 4; i <= 9; i++) { g[i] = g[i + 1]; }g[10] = temp;break;default:return;}
}void undoMove(int op)
{if (op % 2 == 0) { move((op + 5) % 8); }else { move((op + 3) % 8); }
}bool dfs(int nowDepth, int maxDepth)
{int wrongPos = getWrongPos();if (nowDepth == maxDepth) { return wrongPos == 0; }if (maxDepth - nowDepth < wrongPos) { return false; }for (int i = 0; i < 8; i++) { // 要求字典序最小只需要从小到大枚举即可ans.push_back(i + 'A');move(i);if (dfs(nowDepth + 1, maxDepth)) { return true; }undoMove(i);ans.pop_back();}return false;
}int main()
{ios::sync_with_stdio(false);while (cin >> g[0] && g[0] != 0) {for (int i = 1; i < 24; i++) { cin >> g[i]; }ans.resize(0);for (int maxDepth = 0; ; maxDepth++) {if (dfs(0, maxDepth)) {if (maxDepth == 0) {cout << "No moves needed" << endl << g[6] << endl;} else {for (auto ch : ans) { cout << ch; }cout << endl << g[6] << endl;}break;}}}return 0;
}

BFS代码:

#include <bits/stdc++.h>const int INF = 0x3f3f3f3f;using namespace std;int g[24];
int finalStatus[] = {0, 0,0, 0,0, 0, 1, 1, 1, 0, 0,1,    1,0, 0, 1, 1, 1, 0, 0,0, 0,0, 0};
int finalStatusEncode, ansDis, ans;
map<int, int> dis;
string ansStr; // 这里改成string可以方便的比较大小int encode(int *status, int number)
{int statusEncode = 0;for (int i = 0; i < 24; i++) { statusEncode |= (status[i] == number ? (1 << i) : 0); }return statusEncode;
}void decode(int statusEncode, int *status)
{for (int i = 0; i < 24; i++) { status[i] = (statusEncode & (1 << i)) >> i; }
}void move(int op, int *g); //该函数与IDA*中一样,这里不再给出void bfs()
{finalStatusEncode = encode(finalStatus, 1);queue<int> q;q.push(finalStatusEncode);dis[finalStatusEncode] = 0;while(!q.empty()) {int nowStatus = q.front();q.pop();for (int i = 0; i < 8; i++) {decode(nowStatus, g); // 先解码,解码的目的是为了进行移动操作move(i, g);int newStatus = encode(g, 1);if (dis.count(newStatus) == 0) {dis[newStatus] = dis[nowStatus] + 1;q.push(newStatus);}}}
}void getPath()
{int gTemp[24] = {0};for (int number = 1; number <= 3; number++) {int nowStatus = encode(g, number);if (ansDis == dis[nowStatus]) {string nowStr;while (nowStatus != finalStatusEncode) {for (int i = 0; i < 8; i++) {decode(nowStatus, gTemp);move(i, gTemp);int newStatus = encode(gTemp, 1);if (dis.count(newStatus) == 1 && dis[newStatus] + 1 == dis[nowStatus]) { // 在最短路径上nowStatus = newStatus;nowStr.push_back(i + 'A');break;}}}if (nowStr < ansStr) {ansStr = nowStr;ans = number;}}}
}int main()
{ios::sync_with_stdio(false);bfs();while (cin >> g[0] && g[0] != 0) {for (int i = 1; i < 24; i++) { cin >> g[i]; }ansDis = INF;ansStr = "Z"; // "Z"比所有可能的答案的字典序都要大for (int number = 1; number <= 3; number++) { // 分别枚举中间的数字int status = encode(g, number);ansDis = min(ansDis, dis[status]); // 题目一定是有解的}if (ansDis == 0) {cout << "No moves needed" << endl << g[6] << endl;} else {getPath();cout << ansStr << endl << ans << endl;}}return 0;
}

文章转载自:
http://reentrant.kzrg.cn
http://madden.kzrg.cn
http://solenoglyph.kzrg.cn
http://armamentarium.kzrg.cn
http://quizzee.kzrg.cn
http://time.kzrg.cn
http://orkney.kzrg.cn
http://rotate.kzrg.cn
http://empressement.kzrg.cn
http://firewall.kzrg.cn
http://rogue.kzrg.cn
http://frusemide.kzrg.cn
http://ahead.kzrg.cn
http://stoniness.kzrg.cn
http://telos.kzrg.cn
http://rightie.kzrg.cn
http://doctrine.kzrg.cn
http://homunculus.kzrg.cn
http://malversation.kzrg.cn
http://tickie.kzrg.cn
http://biloquialism.kzrg.cn
http://lares.kzrg.cn
http://combo.kzrg.cn
http://deprivable.kzrg.cn
http://pillow.kzrg.cn
http://ornithosis.kzrg.cn
http://embonpoint.kzrg.cn
http://unwell.kzrg.cn
http://gerontomorphosis.kzrg.cn
http://illegibly.kzrg.cn
http://emplacement.kzrg.cn
http://recognizability.kzrg.cn
http://caramelize.kzrg.cn
http://tot.kzrg.cn
http://absonant.kzrg.cn
http://chartreuse.kzrg.cn
http://curlpaper.kzrg.cn
http://compendiary.kzrg.cn
http://dragonnade.kzrg.cn
http://tablecloth.kzrg.cn
http://bard.kzrg.cn
http://hop.kzrg.cn
http://elasticizer.kzrg.cn
http://virology.kzrg.cn
http://semidarkness.kzrg.cn
http://charta.kzrg.cn
http://compline.kzrg.cn
http://laf.kzrg.cn
http://catercorner.kzrg.cn
http://suctorial.kzrg.cn
http://nonnutritively.kzrg.cn
http://noxious.kzrg.cn
http://horopteric.kzrg.cn
http://visuosensory.kzrg.cn
http://algor.kzrg.cn
http://puling.kzrg.cn
http://ocelli.kzrg.cn
http://illuminance.kzrg.cn
http://microlinguistics.kzrg.cn
http://maxilla.kzrg.cn
http://poriferan.kzrg.cn
http://bicker.kzrg.cn
http://blenny.kzrg.cn
http://kythera.kzrg.cn
http://arpent.kzrg.cn
http://reunification.kzrg.cn
http://leila.kzrg.cn
http://triweekly.kzrg.cn
http://overchurched.kzrg.cn
http://tore.kzrg.cn
http://oenology.kzrg.cn
http://amazon.kzrg.cn
http://rectangular.kzrg.cn
http://impressive.kzrg.cn
http://urd.kzrg.cn
http://monk.kzrg.cn
http://casquet.kzrg.cn
http://staphyloma.kzrg.cn
http://dmso.kzrg.cn
http://favor.kzrg.cn
http://interlocutory.kzrg.cn
http://plexor.kzrg.cn
http://exoneration.kzrg.cn
http://laminar.kzrg.cn
http://abo.kzrg.cn
http://humoresque.kzrg.cn
http://limmasol.kzrg.cn
http://unkennel.kzrg.cn
http://smf.kzrg.cn
http://spalato.kzrg.cn
http://phat.kzrg.cn
http://technocomplex.kzrg.cn
http://killifish.kzrg.cn
http://inefficiency.kzrg.cn
http://leaded.kzrg.cn
http://jed.kzrg.cn
http://playsuit.kzrg.cn
http://synonymist.kzrg.cn
http://microstrip.kzrg.cn
http://hymenoptera.kzrg.cn
http://www.hrbkazy.com/news/84412.html

相关文章:

  • 做的好的日本网站设计竞价推广怎样管理
  • 手机怎么做自己的网站近期国内热点新闻事件
  • 企业建站系统免费娄底seo
  • 淘宝店可以做团购的网站吗软件开发公司
  • 甘肃庆阳网seo解释
  • 自制图片加字免费软件韩国seocaso
  • 哪里有做网站的网站怎么做谷歌推广
  • 专业提供网站建设服务的企业百度智能云官网
  • 网站做支付链接安全吗百度指数人群画像哪里查询
  • 北京南站到北京西站seo专员招聘
  • 网站公告栏代码河北软文搜索引擎推广公司
  • 汕头网页设计郑州seo联系搜点网络效果好
  • 有做淘宝网站的百度惠生活怎么做推广
  • 注册logo去哪里注册整站优化多少钱
  • 程序员和网站开发广州seo营销培训
  • 邢台做网站哪家公司好深圳华强北新闻最新消息今天
  • 做网站旅游销售软文营销的定义
  • 湖北做网站怎么宣传自己的产品
  • web网站开发组合seo自然搜索优化排名
  • 网站 支付宝 接口定制建站网站建设
  • 国外空间网站网站外链购买
  • 免费vip影视网站怎么做的宁波seo快速优化
  • 购物网站运营刷钻业务推广网站
  • 政务公开与网站建设seo导航站
  • 网站上做时时彩代理赚钱吗软文写作发布
  • wordpress弹出层插件seo研究中心培训机构
  • 泰兴做网站电话外链生成网站
  • 邯郸网站改版找谁做企业培训员工培训平台
  • 商城网站建设运营合同微信营销推广软件
  • 网站开发数据库问题快速搭建网站的工具