HDU 4801 Pocket Cube BFS
来源:互联网 发布:sql 两个字段相等 编辑:程序博客网 时间:2024/05/16 10:55
链接:http://vjudge.net/contest/view.action?cid=51289#problem/K
题意:给一个小魔方(每面只有四个小块),每个小块有自己的颜色(一共六种颜色,每种颜色四块),问经过最多N次操作(N<=7),每次操作是将魔方某一面转动90度,最多能使多少个面的四个小块颜色都相同。
思路:每次操作产生6种状态,(向前,向后,向左,向右,向上,向下,左半魔方向前和右半魔方向后的操作产生的状态本质是一样的)直接BFS搜索,可能产生的状态一共有6^7种,中间比较麻烦的是状态的变化。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <map>#include <cstdlib>#include <queue>#include <stack>#include <vector>#include <ctype.h>#include <algorithm>#include <string>#include <set>#define PI acos(-1.0)#define maxn 100005#define INF 0x7fffffff#define eps 1e-8typedef long long LL;typedef unsigned long long ULL;using namespace std;struct Matrix{ int step; int a[26];}st,s1,s;int n;int BFS(){ int ans=0; queue <Matrix> q; while(!q.empty()) q.pop(); q.push(st); while(!q.empty()) { s1=q.front(); int res=(s1.a[7]==s1.a[6]&&s1.a[7]==s1.a[13]&&s1.a[7]==s1.a[12])+ (s1.a[0]==s1.a[1]&&s1.a[0]==s1.a[2]&&s1.a[0]==s1.a[3])+ (s1.a[16]==s1.a[17]&&s1.a[16]==s1.a[18]&&s1.a[16]==s1.a[19])+ (s1.a[20]==s1.a[21]&&s1.a[20]==s1.a[22]&&s1.a[20]==s1.a[23])+ (s1.a[4]==s1.a[5]&&s1.a[4]==s1.a[10]&&s1.a[4]==s1.a[11])+ (s1.a[8]==s1.a[9]&&s1.a[8]==s1.a[14]&&s1.a[8]==s1.a[15]); if(res>ans) { ans=res; if(ans==6) return ans; } q.pop(); if(s1.step<n) { int a,b; s=s1;a=s.a[1];b=s.a[3]; s.a[1]=s.a[7];s.a[3]=s.a[13];s.a[7]=s.a[17];s.a[13]=s.a[19]; s.a[17]=s.a[21];s.a[19]=s.a[23];s.a[21]=a;s.a[23]=b; a=s.a[9]; s.a[9]=s.a[8];s.a[8]=s.a[14];s.a[14]=s.a[15];s.a[15]=a; s.step=s1.step+1; q.push(s); s=s1;a=s.a[1];b=s.a[3]; s.a[1]=s.a[21];s.a[3]=s.a[23];s.a[21]=s.a[17];s.a[23]=s.a[19]; s.a[17]=s.a[7];s.a[19]=s.a[13];s.a[7]=a;s.a[13]=b; a=s.a[8]; s.a[8]=s.a[9];s.a[9]=s.a[15];s.a[15]=s.a[14];s.a[14]=a; s.step=s1.step+1; q.push(s); s=s1;a=s.a[6];b=s.a[7]; s.a[6]=s.a[8];s.a[7]=s.a[9];s.a[8]=s.a[23];s.a[9]=s.a[22]; s.a[23]=s.a[4];s.a[22]=s.a[5];s.a[4]=a;s.a[5]=b; a=s.a[0]; s.a[0]=s.a[2];s.a[2]=s.a[3];s.a[3]=s.a[1];s.a[1]=a; s.step=s1.step+1; q.push(s); s=s1;a=s.a[6];b=s.a[7]; s.a[6]=s.a[4];s.a[7]=s.a[5];s.a[4]=s.a[23];s.a[5]=s.a[22]; s.a[23]=s.a[8];s.a[22]=s.a[9];s.a[8]=a;s.a[9]=b; a=s.a[0]; s.a[0]=s.a[1];s.a[1]=s.a[3];s.a[3]=s.a[2];s.a[2]=a; s.step=s1.step+1; q.push(s); s=s1;a=s.a[3];b=s.a[2]; s.a[3]=s.a[5];s.a[2]=s.a[11];s.a[5]=s.a[16];s.a[11]=s.a[17]; s.a[16]=s.a[14];s.a[17]=s.a[8];s.a[14]=a;s.a[8]=b; a=s.a[6]; s.a[6]=s.a[12];s.a[12]=s.a[13];s.a[13]=s.a[7];s.a[7]=a; s.step=s1.step+1; q.push(s); s=s1;a=s.a[3];b=s.a[2]; s.a[3]=s.a[14];s.a[2]=s.a[8];s.a[14]=s.a[16];s.a[8]=s.a[17]; s.a[16]=s.a[5];s.a[17]=s.a[11];s.a[5]=a;s.a[11]=b; a=s.a[6]; s.a[6]=s.a[7];s.a[7]=s.a[13];s.a[13]=s.a[12];s.a[12]=a; s.step=s1.step+1; q.push(s); } } return ans;}int main(){ while(~scanf("%d",&n)) { for(int i=0;i<24;i++) scanf("%d",&st.a[i]); st.step=0; int a=BFS(); printf("%d\n",a); } return 0;}
0 0
- HDU 4801 Pocket Cube BFS
- HDU 4801 Pocket Cube bfs
- hdu 4801 Pocket Cube
- HDU 4801 Pocket Cube
- hdu 4801 Pocket Cube(暴力)
- hdu 4801 Pocket Cube(dfs+模拟)
- HDU 5292 Pocket Cube
- hdu 5292 Pocket Cube
- hdu 5292 Pocket Cube
- hdu 5292 Pocket Cube
- HDU 5292 Pocket Cube
- hdu 5983 Pocket Cube
- Pocket Cube HDU
- HDU 5983Pocket Cube
- [模拟]HDU 5983 Pocket Cube
- hdu 5983 Pocket Cube(模拟)
- 【HDU 5983 Pocket Cube】& 模拟
- HDU 5983 Pocket Cube 模拟
- 为什么软件测试需要变革?
- MYSQL入门学习之二十八:MySQL权限系统简介
- Jquery中使用setInterval和setTimeout
- java中直接获得session对象
- The five core technology for internet of things
- HDU 4801 Pocket Cube BFS
- 基于MVC模式的Adapter的ListView
- 用汇编的眼光看C++ (之x86汇编)
- 两分钟彻底让你明白Android Activity生命周期(图文)!
- Linux统治超级计算领域的九个理由
- Spring AOP(面向切面编程)【AOP中的术语】
- JSTL1.1函数标签库(functions)如fn:length 与 JSTL 自定义Function函数标签
- java.util.NoSuchElementException: Hashtable Enumerator
- eclipse 快捷键使用