您的位置:首页 > 其它

USACO 1.4.2 BFS 解法。

2010-03-19 17:30 330 查看
usaco 1.4.2

BFS

/**//*
ID: hongxdo1
PROG: clocks
LANG: C++
*/

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int const with[10][5] = {{}, {1,2,4,5},{1,2,3},{2,3,5,6},{1,4,7},{2,4,5,6,8},{3,6,9},{4,5,7,8},{7,8,9},{5,6,8,9}};
char t[270000][10], way[270000] = {1}, use[270000][10];
unsigned int pre[270000];
string ans;

void bfs();
bool check(int);
void work(int , int , int );

int main()
{
freopen("clocks.in","r",stdin);
freopen("clocks.out", "w", stdout);
for ( int i = 1, temp; i <= 9; i++)
{
cin>>temp;
t[0][i] = temp%12;
}
bfs();
cout<<ans<<endl;
return 0;
}

void bfs()
{
int tail = 0, head = -1;
while ( tail > head)
{
head++;
for (int i=way[head];i<=9;i++) //i指示1~9种变化的一种
{
if (use[head][i] < 3) // 如果第i种变化少于4次. 每种变化最多3次
{
work(i, head, ++tail);
way[tail] = i;
pre[tail] = head;  // t当中tail位置变化的前一种变化为 t当中head位置的变化.
for ( int j = 1; j <= 9; j++)
{
use[tail][j] = use[head][j];
}
use[tail][i]++;
if (check(tail))
{
ans = char(way[tail] + '0');
for ( int j = pre[tail]; j!= 0; j = pre[j])
{
ans = ' ' + ans;
ans = char(way[j] + '0') + ans;
}
return;
}
}
}
}
}

bool check(int k)
{
for ( int i = 1; i <=9; i++)
{
if (t[k][i]!= 0) return false;
}
return true;
}

void work(int k, int from, int cur)
{
for ( int i = 1; i <= 9; i++)
{
t[cur][i] = t[from][i];
}
for ( int i = 0; i <= 4 && with[k][i] != 0; i++)
{
t[cur][with[k][i]] = (t[from][with[k][i]] + 3) %12;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string c