LeetCode每日一题:滑动谜题
bfs就可以了不过状态我们用hash来存储,如果已经有的我们就跳过搜索,初识状态和目标状态用字符串存较容易记录状态
class Solution {
public:
typedef long long LL;
int bfs(string s, string e)
{
queue<string> q;
unordered_map<string, LL> d;
q.push(s);
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while (q.size())
{
auto t = q.front();
q.pop();
if(t == e) return d[t];
LL distance = d[t];
int k = t.find("0");
int x = k / 3, y = k % 3;
for (int i = 0; i < 4; i ++ )
{
int a = x + dx[i], b = y + dy[i];
if(a >= 0 && a < 2 && b >= 0 && b < 3)
{
swap(t[k], t[a * 3 + b]);
if(!d.count(t))
{
d[t] = distance + 1;
q.push(t);
}
swap(t[k], t[a * 3 + b]);
}
}
}
return -1;
}
int slidingPuzzle(vector<vector<int>>& board) {
string start = "", end = "123450";
for (int i = 0; i < 2; i ++ )
for (int j = 0; j < 3; j ++ )
start += board[i][j] + '0';
LL res = bfs(start, end);
return res;
}
};
Acwing每日一题:改变数组元素
差分,通过
!
!
[
d
i
]
!![di]
!![di]输出0或1
时间复杂度:
O
(
n
)
O(n)
O(n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
int n;
int d[N];
int main()
{
int T;
cin >> T;
while (T -- )
{
cin >> n;
memset(d, 0, (n + 1) * 4);
for (int i = 1; i <= n; i ++ )
{
int x;
cin >> x;
int l = max(1, i - x + 1), r = i;
d[l] ++;
d[r + 1] --;
}
for (int i = 1; i <= n; i ++ )
{
d[i] += d[i - 1];
printf("%d ", !!d[i]);
}
cout << endl;
}
return 0;
}