本文介绍了AtCoder Beginner Contest 224中的五个问题A-Tires、B-Mongeness、C-Triangle?、D-8Puzzle on Graph和E-Integers on Grid的解题思路和关键代码片段,包括字符判断、数据范围暴力搜索、三角形判断、图论操作和动态规划算法应用。
首先我们要转换一下,转换成第
i
i
i个顶点在第
j
j
j块,并且用块
9
9
9表示为空,比如第一个样例我们转换后就是931456782。然后我们要使得它变成123456789,我们就可以使用BFS来解决这题,我们把当前为空块顶点相连的边的块全部都转移一次,然后存到队列里,用队列解决问题,用map来储存答案。
代码如下:
#include<bits/stdc++.h>usingnamespace std;constint maxn =50;
vector<int> e[maxn];
map<string,int> mp;intmain(){
string s ="999999999";
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);int m;
cin >> m;for(int i =1; i <= m; i++){int u, v;
cin >> u >> v;
e[u].push_back(v);
e[v].push_back(u);}for(int i =1; i <=8; i++){int x;
cin >> x;
s[x -1]= i +'0';}
mp[s]=0;
queue<string> q;
q.push(s);while(!q.empty()){
string s = q.front();
q.pop();int u =0;for(int i =1; i <=9; i++){if(s[i -1]=='9'){
u = i;}}for(auto x : e[u]){
string t = s;swap(t[u -1], t[x -1]);//每一个相邻的边都操作一次if(mp.count(t))continue;//出现过了
mp[t]= mp[s]+1;
q.push(t);}}if(mp.count("123456789")==0){
cout <<-1<< endl;}else{
cout << mp["123456789"]<< endl;}return0;}