2*3格子移字母

资源限制

内存限制:256.0MB   C/C++时间限制:1.0s   Java时间限制:3.0s   Python时间限制:5.0s

  2x3=6个方格中放入ABCDE五个字母,右下角的那个格空着。如图所示。



  和空格子相邻的格子中的字母可以移动到空格中,比如,图中的C和E就可以移动,移动后的局面分别是:

  A B
  D E C

  A B C
  D E

  为了表示方便,我们把6个格子中字母配置用一个串表示出来,比如上边的两种局面分别表示为:

  AB*DEC
  ABCD*E

  题目的要求是:请编写程序,由用户输入若干表示局面的串,程序通过计算,输出是否能通过对初始状态经过若干次移动到达该状态。可以实现输出1,否则输出0。初始状态为:ABCDE*

  用户输入的格式是:先是一个整数n,表示接下来有n行状态。程序输出也应该是n行1或0

  例如,用户输入:

  3
  ABCDE*
  AB*DEC
  CAED*B

  则程序应该输出:
  1
  1
  0


  注意:

  请仔细调试!您的程序只有能运行出正确结果的时候才有机会得分!

  在评卷时使用的输入数据与试卷中给出的实例数据可能是不同的。

  请把所有函数写在同一个文件中,调试好后,存入与【考生文件夹】下对应题号的“解答.txt”中即可。

  相关的工程文件不要拷入。

  源代码中不能能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。

  允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。

#include<iostream>
#include<cstring>
#include<set>
#include<list>
using namespace std;
int n;
string a;
set<string> st;
list<string> li;
char d[7] = "ABCDE*", e[7] = "ABCDE*";
int dir[] = { -3,-1,1,3 };
string t(char x[]) {
    string u;
    for (int i = 0; i < 6; i++) {
        u += x[i];
    }
    return u;
}
int main() {
    st.insert("ABCDE*");
    li.push_back("ABCDE*");
    //枚举每一种可能的情况
    while (!li.empty()) {//li用来存当前的情况
        int size = st.size();
        a = li.front();//每次取一个字符串出来就要删除一个
        try {
            li.erase(li.begin());
        }
        catch (exception li) {
            break;
        }
        for (int i = 0; i < 6; i++)
            d[i] = a[i], e[i] = a[i];//e数组表示存的原始字符串
        for (int i = 0; i < size; i++) {
            int j;
            for (j = 0; j < 6; j++) {
                if (d[j] == '*')
                    break;
            }
            //枚举
            for (int k = 0; k < 4; k++) {
                int newindex = j + dir[k];
                if (newindex < 0 || newindex > 5)
                    continue;
                if (j % 3 == newindex % 3 || j / 3 == newindex / 3) {
                    swap(d[j], d[newindex]);
                    string news;
                    news = t(d);
                    for (int g = 0; g < 6; g++) d[g] = e[g];
                    if (!st.count(news)) {
                        st.insert(news);
                        li.push_front(news);
                    }
                }
            }
        }
    }
    cin >> n;
    while (n--) {
        cin >> a;
        //查询是否有这种情况
        if (st.count(a))
            cout << "1" << endl;
        else
            cout << "0" << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值