usaco Magic Squares

各一个2x4的字符数组,有三种不同的操作,要求使用最少的操作,从“12345678”,转换成目标字符,输出最少步数,以及操作次序。

对C++类库的用法还是不够熟啊。

/*
ID: modengd1
PROG: msquare
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <queue>
#include <map>
#include <string>
using namespace std;
struct node
{
    int step;
    string sta,ans;
};
map<string,bool> vis;
void opA(node &N)
{
    N.step++;
    N.ans.push_back(‘A‘);
    for(int i=0;i<4;i++)
    {
        swap(N.sta[i],N.sta[i+4]);
    }
}
void opB(node &N)
{
    N.step++;
    N.ans.push_back(‘B‘);
    char temp=N.sta[3];
    for(int i=3;i>0;i--)
    {
        N.sta[i]=N.sta[i-1];
    }
    N.sta[0]=temp;
    temp=N.sta[7];
    for(int i=7;i>4;i--)
    {
        N.sta[i]=N.sta[i-1];
    }
    N.sta[4]=temp;
}
void opC(node &N)
{
    N.step++;
    N.ans.push_back(‘C‘);
    char temp=N.sta[1];
    N.sta[1]=N.sta[5];
    N.sta[5]=N.sta[6];
    N.sta[6]=N.sta[2];
    N.sta[2]=temp;
}
void BFS(string target)
{
    queue<node> Q;
    node now;
    now.sta="12348765";
    now.step=0;now.ans="";
    vis[now.sta]=true;
    Q.push(now);
    while(!Q.empty())
    {
        node next;
        node &N=next;
        now=Q.front();
        Q.pop();
        if(now.sta==target)
        {
            cout<<now.step<<endl<<now.ans<<endl;
            return;
        }
        next=now;
        opA(N);
        if(!vis[next.sta])
        {
            Q.push(next);
            vis[next.sta]=true;
        }
        next=now;
        opB(N);
        if(!vis[next.sta])
        {
            Q.push(next);
            vis[next.sta]=true;
        }
        next=now;
        opC(N);
        if(!vis[next.sta])
        {
            Q.push(next);
            vis[next.sta]=true;
        }

    }
}
int main()
{
    freopen("msquare.in","r",stdin);
    freopen("msquare.out","w",stdout);
    string target;
    char ch;
    for(int i=0;i<8;i++)
    {
        scanf("%c",&ch);
        target.push_back(ch);
        getchar();
    }
    swap(target[5],target[6]);//题目是按顺时钟的,而我按从上到下,从左到右处理的
    swap(target[7],target[4]);
    BFS(target);
    return 0;
}

  

时间: 2024-10-12 22:47:09

usaco Magic Squares的相关文章

洛谷 P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“

洛谷P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母“

Luogu P2730 魔板 Magic Squares

P2730 魔板 Magic Squares 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母"

BFS解Magic Squares

Magic Squares IOI'96 Following the success of the magic cube, Mr. Rubik invented its planarversion, called magic squares. This is a sheet composed of 8 equal-sizedsquares: 1 2 3 4 8 7 6 5 In this task we consider the version where each square has a d

840. Magic Squares In Grid (5月27日)

开头 这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧 题目原文 Magic Squares In Grid A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.

魔板 Magic Squares

[题目描述]: 魔板 Magic Squares [思路]: 是不是感觉和八数码有点像? 显而易见的宽搜,把魔板的状态表示为排列,则状态最多有\(8! = 40320\)种,空间是可以接受的,对于是第几个排列可以用康拓展开来实现(我想在做八数码的时候你们都深知这个套路),然后根据题目中的三种方式转移状态,每个状态转移出\(3\)个子状态,注意判重!,一旦目标状态出现,那个所搜索的层数一定是能得到该状态的最小步数.最后就是代码细节多,要仔细. #include<cstdio> #include&

【Leetcode_easy】840. Magic Squares In Grid

problem 840. Magic Squares In Grid 参考 1. Leetcode_easy_840. Magic Squares In Grid; 完 原文地址:https://www.cnblogs.com/happyamyhope/p/11214881.html

神器的方块Magic Squares

题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都有一种颜色.这8种颜色用前8个正整数来表示.可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列.对于上图的魔板状态,我们用序列(1,2,3,4,5,6,7,8)来表示.这是基本状态. 这里提供三种基本操作,分别用大写字母"A","B",&

[LeetCode] 840. Magic Squares In Grid_Easy

A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum. Given an grid of integers, how many 3 x 3 "magic square" subgrids are there?  (Each subgrid is co