| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
聪明的打字员#include<stdio.h>
#include<string.h>
#include<iostream>
#include<queue>
using namespace std;
typedef struct
{
int s[6];
int sum;
int cursor;
int sign;
}node;
int ans[532][8],total = 0;
int visited[6][6][6][6][6][6][6][10] = {0};
int sign[10][6] = { {1,0,0,0,0,0},
{1,1,0,0,0,0},
{1,1,1,0,0,0},
{1,1,1,1,0,0},
{1,1,1,1,1,0},
{1,1,1,1,1,1},
{1,0,0,0,0,1},
{1,1,0,0,0,1},
{1,1,1,0,0,1},
{1,1,1,1,0,1},
};
void bfs()
{
node a,b;
int i;
for(i = 0;i < 6;i++)
{
a.s[i] = i;
}
a.sum = 0;a.cursor = 0;a.sign = 0;
queue<node> sq;
sq.push(a);
visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign] = 1;
while(!sq.empty())
{
a = sq.front();sq.pop();
for(i = 0;i < 6;i++)
{
ans[total][i] = a.s[i];
}
ans[total][6] = a.sign;ans[total][7] = a.sum;
total++;
a.sum++;
if(a.cursor > 0)
{
swap(a.s[a.cursor],a.s[0]);
if(!visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign])
{
sq.push(a);
visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign] = 1;
}
swap(a.s[a.cursor],a.s[0]);
}
if(a.cursor < 5)
{
a.cursor++;
int temp = a.sign;
if(a.cursor > a.sign||(a.cursor > a.sign - 6&&a.sign > 5))
{
if(a.sign == 9)
a.sign = 5;
else
a.sign++;
}
if(!visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign])
{
sq.push(a);
visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign] = 1;
}
a.cursor--;
a.sign = temp;
if(a.sign < 5)
a.sign += 6;
swap(a.s[a.cursor],a.s[5]);
if(!visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign])
{
sq.push(a);
visited[a.s[0]][a.s[1]][a.s[2]][a.s[3]][a.s[4]][a.s[5]][a.cursor][a.sign] = 1;
}
}
}
}
int main()
{
int min = 20112011,step,j,i;
char s1[7],s2[7];
int a[6],b[6];
bfs();
scanf("%s%s",s1,s2);
for(i = 0;i < 6;i++)
{
a[i] = s1[i] - '0';
b[i] = s2[i] - '0';
}
for(i = 0;i < total;i++)
{
step = ans[i][7];
for(j = 0;j < 6;j++)
{
if(a[ans[i][j]] != b[j]&&!sign[ans[i][6]][j])
break;
else
step += abs(a[ans[i][j]] - b[j]);
}
if(j == 6&&min > step)
min = step;
}
printf("%d\n",min);
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator