Luggage Lock

原题链接

题意

给一个锁,每次可以选择连续的一段拨动一次,给定一个初始状态,再给定一个目标状态,问从初始状态转到目标状态需要几步?

思路

最短几步首先想到 B F S BFS BFS可以求最短路的特性。

然后我们看从初始状态到目标状态,需要怎么转,就用 a [ i ] − b [ i ] a[i] - b[i] a[i]b[i],得到给定初始到目标的转法,然后我们可以把它转换成从0000到目标状态,也就是说把负数 + 10 + 10 +10,其实一起(含正数) + 10 + 10 +10也可以, % 10 \%10 %10就可以了。

现在问题就变成了从0000到一个目标状态(就是上面所说的转法)需要几步。

B F S + m a p BFS + map BFS+map打表即可。

代码

#include<bits/stdc++.h>
using namespace std;

int start[4] = {0, 0, 0, 0};
int End[4] = {9, 9, 9, 9}; 

struct node
{
    int f[4];
};

string change(int a[])
{
    string s = "";
    for (int i = 0; i < 4; i ++ )
    {
        s.push_back(a[i] + '0');
    }
    return s;
}

unordered_map<string, int> ans;
int caozuo[20][4] ={{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 1, 1, 1}, {0, 1, 0, 0},  {0, 1, 1, 0}, {0, 1, 1, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {-1, 0, 0, 0}, {-1, -1, 0, 0}, {-1, -1, -1, 0}, {-1, -1, -1, -1}, {0, -1, 0, 0},  {0, -1, -1, 0}, {0, -1, -1, -1}, {0, 0, -1, 0}, {0, 0, -1, -1}, {0, 0, 0, -1}};

void bfs()
{
	queue<node> q;
	node head;
	memcpy(head.f, start, sizeof start);
	q.push(head);
	
	while (!q.empty())
	{
		node t = q.front();
//		cout << change(t.f) << endl;
		int d = ans[change(t.f)];
		q.pop();
		for (int i = 0; i < 20; i ++ )
		{
			node newnode;
			memcpy(newnode.f, t.f, sizeof t.f);
			for (int j = 0; j < 4; j ++ )
			{
				newnode.f[j] += caozuo[i][j];
				//注意处理负数的情况
				newnode.f[j] = newnode.f[j] + 10 ;
				newnode.f[j] %= 10;
			}
			bool flag = 0;
			for (int j = 0; j < 4; j ++ )
			{
				if (newnode.f[j] > 9 || newnode.f[j] < 0) 
				{
					flag = 1;
					break;
				}
			}
			if (flag) continue;
			string tt = change(newnode.f);
			if (!ans.count(tt))
			{
				ans[tt] = d + 1;
				q.push(newnode);
			}
		}
	}
}

int main()
{
	int t; cin >> t;
	bfs();
	while (t -- )
	{
		string a, b;
		cin >> a >> b;
		for (int i = 0; i < 4; i ++ )
		{
			End[i] = ((a[i] - '0') - (b[i] - '0') + 10) % 10;
		}
//		cout << change(End) << endl;
		cout << ans[change(End)] << endl;
	}
	return 0;
}

总结

人都傻了,我还搁那双向广搜呢。。。
附上代码


//f 搜索
#include<bits/stdc++.h>
#define endl '\n' 
// #define int long long
using namespace std;
const int N = 2e5+10;
typedef long long ll;

int start[4];
int End[4];

struct node{
    int f[4];
};

string change(int a[])
{
    string s = "";
    for (int i = 0; i < 4; i ++ )
    {
        s.push_back(a[i] + '0');
    }
    return s;
}
int caozuo[20][4] ={{1, 0, 0, 0}, {1, 1, 0, 0}, {1, 1, 1, 0}, {1, 1, 1, 1}, {0, 1, 0, 0},  {0, 1, 1, 0}, {0, 1, 1, 1}, {0, 0, 1, 0}, {0, 0, 1, 1}, {0, 0, 0, 1}, {-1, 0, 0, 0}, {-1, -1, 0, 0}, {-1, -1, -1, 0}, {-1, -1, -1, -1}, {0, -1, 0, 0},  {0, -1, -1, 0}, {0, -1, -1, -1}, {0, 0, -1, 0}, {0, 0, -1, -1}, {0, 0, 0, -1}};


int kuozhan(queue<node>& q, unordered_map<string, int>& ma, unordered_map<string, int>& mb)
{
    int d = ma[change(q.front().f)];
    while (!q.empty() && ma[change(q.front().f)] == d)
    {
        node t;
        t = q.front();
        q.pop();

        for (int i = 0; i < 20; i ++ )
        {
            node newnode;
            memcpy(newnode.f, t.f, sizeof t.f);
            for (int j = 0; j < 4; j ++ )
            {
                newnode.f[j] += caozuo[i][j];
            }
            string z = change(newnode.f);
            if (mb.count(z)) return d + 1 + mb[z];
            if (ma.count(z)) continue;
            ma[z] = d + 1;
            q.push(newnode);
        }
    }
    return -1;
}

int bfs()
{
    queue<node> qa, qb;
    unordered_map<string, int> ma, mb;
    node head;
    memcpy(head.f, start, sizeof start);
    ma[change(head.f)] = 0;
    qa.push(head);
    memcpy(head.f, End, sizeof End);
    mb[change(head.f)] = 0;
    qb.push(head);

    while (!qa.empty() && !qb.empty())
    {
        int temp = -1;
        if (qa.size() >= qb.size())
        {
            temp = kuozhan(qa, ma, mb);
        }
        else
        {
            temp = kuozhan(qb, mb, ma);
        }
        if (temp != -1)
        {
            return temp;
        }
    }
    return -1;
}

signed main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        for (int i = 0; i < 4; i ++ )
        {
            scanf("%1d", &start[i]);
            // cin >> start[i];
        }
        for (int i = 0; i < 4; i ++ )
        {
            scanf("%1d", &End[i]);
            // cin >> End[i];
        }
        cout << bfs() << endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于要求的Java代码实现: ``` // Stuff类 public abstract class Stuff { protected String name; // 物品名称 public Stuff(String name) { this.name = name; } public String getName() { return name; } public abstract String toString(); } // Book类,继承自Stuff类 public class Book extends Stuff { public Book(String name) { super(name); } @Override public String toString() { return "Book: " + name; } } // Cloth类,继承自Stuff类 public class Cloth extends Stuff { public Cloth(String name) { super(name); } @Override public String toString() { return "Cloth: " + name; } } // Bag类 public abstract class Bag { protected ArrayList<Stuff> stuffs = new ArrayList<>(); // 物品列表 public abstract void putStuff(Stuff stuff); // 放入物品 public abstract Stuff getStuff(int index); // 取出物品 public void outputStuffs() { // 输出物品列表 for (Stuff stuff : stuffs) { System.out.println(stuff.toString()); } } } // SchoolBag类,继承自Bag类 public class SchoolBag extends Bag { @Override public void putStuff(Stuff stuff) { if (stuff instanceof Book) { // 只能放书 stuffs.add(stuff); } else { System.out.println("This bag can only put books."); } } @Override public Stuff getStuff(int index) { if (index >= 0 && index < stuffs.size()) { return stuffs.remove(index); } else { System.out.println("Invalid index."); return null; } } } // Luggage类,继承自Bag类 public class Luggage extends Bag { @Override public void putStuff(Stuff stuff) { if (stuff instanceof Cloth) { // 只能放衣服 stuffs.add(stuff); } else { System.out.println("This luggage can only put clothes."); } } @Override public Stuff getStuff(int index) { if (index >= 0 && index < stuffs.size()) { return stuffs.remove(index); } else { System.out.println("Invalid index."); return null; } } } // 测试类 public class Test { public static void main(String[] args) { Stuff[] stuffs = { new Book("Java Programming"), new Book("Data Structures"), new Cloth("Shirt"), new Cloth("Pants") }; SchoolBag schoolBag = new SchoolBag(); Luggage luggage = new Luggage(); for (Stuff stuff : stuffs) { if (stuff instanceof Book) { schoolBag.putStuff(stuff); } else if (stuff instanceof Cloth) { luggage.putStuff(stuff); } } System.out.println("School Bag:"); schoolBag.outputStuffs(); System.out.println("Luggage:"); luggage.outputStuffs(); } } ``` 运行结果: ``` School Bag: Book: Java Programming Book: Data Structures Luggage: Cloth: Shirt Cloth: Pants ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值