计蒜客-一维跳棋

来源:互联网 发布:网络协同是什么意思 编辑:程序博客网 时间:2024/05/16 18:46

一维跳棋是一种在
1×(2N+1)1\times(2N+1)
1×(2N+1) 的棋盘上玩的游戏。一共有
NN
N 个棋子,其中
NN
N 个是黑的,
NN
N 个是白的。游戏开始前,
NN
N 个白棋子被放在一头,
NN
N 个黑棋子被放在另一头,中间的格子空着。在这个游戏里有两种移动方法是允许的:你可以把一个棋子移到与它相邻的空格;你可以把一个棋子跳过一个(仅一个)与它不同色的棋子到达空格。
对于
N=3N=3
N=3 的情况,棋盘状态依次为:

1
WWW BBB
2
WW WBBB
3
WWBW BB
4
WWBWB B
5
WWB BWB
6
W BWBWB
7
WBWBWB
8
BW WBWB
9
BWBW WB
10
BWBWBW
11
BWBWB W
12
BWB BWW
13
B BWBWW
14
BB WBWW
15
BBBW WW
16
BBB WWW

对应的空格所在的位置(从左数)为:3 5 6 4 2 1 3 5 7 6 4 2 3 5 4。
输入格式
输入仅一个整数,表示针对
N(1≤N≤12)N(1 \leq N \leq 12)
N(1≤N≤12) 的取值。
输出格式
依次输出空格所在棋盘的位置,每个整数间用空格分隔,每行
55
5 个数(每行结尾无空格,最后一行可以不满
55
5 个数;如果有多组移动步数最小的解,输出第一个数最小的解)
样例输入
4
样例输出
4 6 7 5 3
2 4 6 8 9
7 5 3 1 2
4 6 8 7 5
3 4 6 5

未完标记

#include"iostream"#include<vector>#include"string.h"#include"queue"#include<map>using namespace std;int n;string sta;string res;vector<int> gg;map<string,int> panduan;struct node{    string qipan;    int kg;    int step;    vector<int> jj;};queue<node> gd;void bfs(){    node mm,nn;    mm.qipan=sta; mm.kg=n+1; mm.step=0; mm.jj=gg;    gd.push(mm);    panduan[mm.qipan]=2;    while(!gd.empty())    {        //cout<<nn.qipan<<endl;        nn=gd.front();        gd.pop();        if(nn.qipan==res)        {            for(int i=0;i<nn.step-1;i++)            {                if(i!=0&&i%5==0)                {                    cout<<nn.jj[i]<<endl;                }                else                cout<<nn.jj[i]<<" ";            }            cout<<nn.jj[nn.step-1]<<endl;            return;        }        for(int i=-2;i<=2;i++)        {            if(i==0)            continue;            mm=nn;            mm.kg=nn.kg+i;            if(mm.kg>0&&mm.kg<=2*n+1)            {                mm.step+=1;                char temp=mm.qipan[nn.kg-1];                mm.qipan[nn.kg-1]=mm.qipan[mm.kg-1];                mm.qipan[mm.kg-1]=temp;                if(panduan[mm.qipan]==2)                    continue;                panduan[mm.qipan]=2;                mm.jj.push_back(mm.kg);                gd.push(mm);            }        }    }}int main(){    cin>>n;    for(int i=0;i<n;i++)        sta.push_back('W');    sta.push_back(' ');    for(int i=0;i<n;i++)        sta.push_back('B');    for(int i=0;i<n;i++)        res.push_back('B');    res.push_back(' ');    for(int i=0;i<n;i++)        res.push_back('W');    bfs();     return 0;}
0 0
原创粉丝点击