Acwing 搜索进阶打卡
1097. 池塘计数
https://www.acwing.com/problem/content/1099/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N=1005;
char a[N][N];
int n,m;
int ans;
int dx[]={0,0,1,-1,1,1,-1,-1};
int dy[]={1,-1,0,0,-1,1,-1,1};
void dfs(int x,int y){
a[x][y]='.';
for(int i=0;i<8;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1 && nx<=n && ny>=1 && ny<=m && a[nx][ny]=='W'){
dfs(nx,ny);
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='W'){
ans++;
dfs(i,j);
}
}
}
cout<<ans<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
1076. 迷宫问题
https://www.acwing.com/problem/content/1078/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=1005;
int a[N][N];
PII pre[N][N];//记录上一个走过来的值
int n;
queue<PII>q;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void bfs(){
memset(pre,-1,sizeof pre);
pre[n-1][n-1]={0,0};
q.push({n-1,n-1});
while(q.size()){
auto t=q.front();
q.pop();
for(int i=0;i<4;i++){
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if(nx<0 ||nx>=n || ny<0 || ny>=n) continue;
if(a[nx][ny]) continue;
if(pre[nx][ny].x!=-1) continue;
q.push({nx,ny});
pre[nx][ny]={t.x,t.y};
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
bfs();
PII end={0,0};
while(1){
cout<<end.x<<" "<<end.y<<endl;
if(end.x==n-1 && end.y==n-1) break;
end=pre[end.x][end.y];
}
return 0;
}
// freopen("testdata.in", "r", stdin);
1107. 魔板
https://www.acwing.com/problem/content/1109/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
char g[2][4];
string start="12345678";
string endstring;
unordered_map<string,int>dist;
unordered_map<string, pair<char, string>> pre;
void set(string s){
for(int i=0;i<4;i++) g[0][i]=s[i];
for(int i=7,j=0;j<4;i++,j--) g[1][j]=s[i];
}
string get(){
string res;
for (int i = 0; i < 4; i ++ ) res += g[0][i];
for (int i = 3; i >= 0; i -- ) res += g[1][i];
return res;
}
string fun1(string s){
set(s);
for (int i = 0; i < 4; i ++ ) swap(g[0][i], g[1][i]);
return get();
}
string fun2(string s){
set(s);
int v0 = g[0][3], v1 = g[1][3];
for (int i = 3; i >= 0; i -- )
{
g[0][i] = g[0][i - 1];
g[1][i] = g[1][i - 1];
}
g[0][0] = v0, g[1][0] = v1;
return get();
}
string fun3(string s){
set(s);
int v = g[0][1];
g[0][1] = g[1][1];
g[1][1] = g[1][2];
g[1][2] = g[0][2];
g[0][2] = v;
return get();
}
int bfs(){
if(start==endstring) return 0;
queue<string>q;
q.push(start);
dist[start]=0;
while(q.size()){
string t=q.front();
q.pop();
string m[3];
m[0]=fun1(t);
m[1]=fun2(t);
m[2]=fun3(t);
for(int i=0;i<3;i++){
if(!dist.count(m[i])){
dist[m[i]]=dist[t]+1;
pre[m[i]]={'A'+i,t};
q.push(m[i]);
if(m[i]==endstring) return dist[endstring];
}
}
}
return -1;
}
int main(){
for(int i=0;i<8;i++){
int num;
cin>>num;
endstring=endstring+char(num+'0');
}
int step=bfs();
string res="";
while (endstring != start)
{
res += pre[endstring].first;
endstring = pre[endstring].second;
}
reverse(res.begin(), res.end());
if (step > 0) cout << res << endl;
cout<<step<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
190. 字串变换(双向BFS)
https://www.acwing.com/problem/content/192/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
string A,B;
string a[6],b[6];
int n;
int extend(queue<string>&q,unordered_map<string,int>&da,unordered_map<string,int>&db,string a[],string b[]){
int d=da[q.front()];//因为要算出同一层的状态,所以先算出该状态的长度
while(q.size() && da[q.front()]==d){
auto t=q.front();
q.pop();
for(int i=0;i<n;i++){
for(int j=0;j<t.size();j++){
if(t.substr(j,a[i].size())==a[i]){
//匹配到了
string r=t.substr(0,j)+b[i]+t.substr(j+a[i].size());//替换
if(db.count(r)) return da[t]+db[r]+1; //说明在另外一个bfs里出现该状态
if(da.count(r))continue;
da[r]=da[t]+1;
q.push(r);
}
}
}
}
return 11;//说明这次搜索的状态层没有搜索到
}
int bfs(){
queue<string>qa,qb;
unordered_map<string,int>da,db;
qa.push(A),qb.push(B);
da[A]=0,db[B]=0;
int step=0;
int t=0;
while(qa.size() && qb.size()){
if(qa.size()<qb.size()){
t=extend(qa,da,db,a,b);
}
else{
t=extend(qb,db,da,b,a);
}
if(t<=10){
return t;
}
if(++step==10) return -1;
}
return -1;
}
int main(){
cin>>A>>B;
while(cin>>a[n]>>b[n]) n++;
int t=bfs();
if(t==-1) puts("NO ANSWER!");
else cout<<t<<endl;
return 0;
}
// freopen("testdata.in", "r", stdin);
1116. 马走日
https://www.acwing.com/problem/content/1118/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
using namespace std;
typedef long long LL;
int n,m,x,y;
int st[15][15];
int T;
int ans;
int dx[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int dy[] = {1, 2, 2, 1, -1, -2, -2, -1};
void dfs(int x,int y,int cnt){
if(cnt==n*m){
ans++;
return ;
}
st[x][y]=1;
for(int i=0;i<8;i++){
int a=x+dx[i];
int b=y+dy[i];
if(a<0 || a>=n ||b<0 ||b>=m) continue;
if(st[a][b]) continue;
dfs(a,b,cnt+1);
}
st[x][y]=0;
}
int main(){
cin>>T;
while(T--){
ans=0;
cin>>n>>m>>x>>y;
memset(st,0,sizeof st);
dfs(x,y,1);
cout<<ans<<endl;
}
return 0;
}
// freopen("testdata.in", "r", stdin);

浙公网安备 33010602011771号