Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

聪明的打字员

Posted by 232098 at 2012-07-08 11:08:11
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator