华师一附中OI组
标题:
P1213 时钟
[打印本页]
作者:
admin
时间:
2018-7-3 16:23
标题:
P1213 时钟
https://www.luogu.org/problemnew/show/P1213
题目描述
考虑将如此安排在一个 3 x 3 行列中的九个时钟:
目标要找一个最小的移动顺序将所有的指针指向12点。下面原表格列出了9种不同的旋转指针的方法,每一种方法都叫一次移动。选择1到9号移动方法,将会使在表格中对应的时钟的指针顺时针旋转90度。
移动方法 受影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
Example
[但这可能不是正确的方法,请看下面]
输入输出格式
输入格式:
第1-3行: 三个空格分开的数字,每个数字表示一个时钟的初始时间,3,6,9,12。数字的含意和上面第一个例子一样。
输出格式:
单独的一行包括一个用空格分开的将所有指针指向12:00的最短移动顺序的列表。
如果有多种方案,输出那种使其连接起来数字最小的方案。(举例来说5 2 4 6 < 9 3 1 1)。
输入输出样例
输入样例#1:
9 9 12
6 6 6
6 3 6
输出样例#1:
4 5 8 9
说明
题目翻译来自NOCOW。
USACO Training Section 1.4
作者:
黄煦喆
时间:
2018-10-13 22:40
#include<iostream>
#include<set>
#include<queue>
using namespace std;
int n=9,t,l;
string const goal="000000000";
string s,p,qq,ans;
const int v[10][5]={
{0,0,0,0,0},
{0,1,3,4,0},
{0,1,2,0,0},
{1,2,4,5,0},
{0,3,6,0,0},
{1,3,4,5,7},
{2,5,8,0,0},
{3,4,6,7,0},
{6,7,8,0,0},
{4,5,7,8,0},},
ll[10]={0,4,3,4,3,5,3,4,3,4};
set<string>se;
struct ha
{
string clock,step;
ha(string str,string st):clock(str),step(st) {}
};
queue<ha>q;
string change(string ss,int k)
{
for(int i=0;i<ll[k];i++)ss[v[k][i]]=(ss[v[k][i]]-'0'+1)%4+'0';
return ss;
}
int main()
{
for(int i=1;i<=n;++i)cin>>t,s+=t/3%4+'0';
q.push(ha(s,"")),se.insert(s);
while(!q.empty())
{
string a=q.front().clock,b=q.front().step;
if(a==goal)break;
else for(int i=1;i<=n;i++)
{
p=change(a,i),qq=b+char(i+'0');
if(!se.count(p))se.insert(p),q.push(ha(p,qq));
}
q.pop();
}
ans=q.front().step,l=ans.size();
for(int i=0;i<l;i++)cout<<ans[i]<<' ';
return 0;
}
复制代码
作者:
黄煦喆
时间:
2018-10-13 22:40
黄煦喆 发表于 2018-10-13 22:40
BFS做的,后面4个点TLE了
作者:
admin
时间:
2018-10-14 08:27
盲目穷举就可以了 不需要广搜,注意,钟之间的相互关系。
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2