BFS
BFS能解决的问题图论都能解决,但BFS能跑的图必须有每条边权值相同的特质。
电路维修



#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 1050010
using namespace std;
struct nond{
int number,dis;
bool operator < (nond b) const{
return dis>b.dis;
}
};
char s[1010];
int t,r,c,tot;
int dis[MAXN];
int to[MAXN*2],net[MAXN*2],cap[MAXN*2],head[MAXN*2];
void add(int u,int v,int w){
to[++tot]=v;net[tot]=head[u];cap[tot]=w;head[u]=tot;
to[++tot]=u;net[tot]=head[v];cap[tot]=w;head[v]=tot;
}
void dijkstra(int s){
priority_queue<nond>que;
memset(dis,0x3f,sizeof(dis));
que.push((nond){s,0});
dis[s]=0;
while(!que.empty()){
nond now=que.top();
que.pop();
if(dis[now.number]!=now.dis) continue;
for(int i=head[now.number];i;i=net[i])
if(dis[to[i]]>dis[now.number]+cap[i]){
dis[to[i]]=dis[now.number]+cap[i];
que.push((nond){to[i],dis[to[i]]});
}
}
}
int main(){
tot=0;
memset(head,0,sizeof(head));
scanf("%d%d",&r,&c);
for(int i=1;i<=r;i++){
scanf("%s",s+1);
for(int j=1;j<=c;j++)
if(s[j]=='/'){
add((i-1)*(c+1)+j+1,i*(c+1)+j,0);
add((i-1)*(c+1)+j,i*(c+1)+j+1,1);
}
else{
add((i-1)*(c+1)+j,i*(c+1)+j+1,0);
add((i-1)*(c+1)+j+1,i*(c+1)+j,1);
}
}
dijkstra(1);
if(dis[(r+1)*(c+1)]==0x3f3f3f3f) cout<<"NO SOLUTION"<<endl;
else cout<<dis[(r+1)*(c+1)]<<endl;
}
魔板



#include<bits/stdc++.h>
using namespace std;
#define int long long
int ed,cnt,t[10];
vector<int>q;
map<int,int>pre;
map<int,char>ans;
inline int A_(int x)
{
return (x%t[4])*t[4]+x/t[4];
}
inline int B_(int x)
{
return x/t[5]*t[4]+(x/t[4]%10)*t[7]+(x%t[4])/10+(x%10)*t[3];
}
//x第y位的数变成第z位的数
inline int change(int x,int y,int z)
{
return (x/t[z-1]%10-x/t[y-1]%10)*t[y-1];
}
inline int C_(int x)
{
return x+change(x,7,3)+change(x,6,7)+change(x,3,2)+change(x,2,6);
}
void print(int x)
{
if(pre[x]==-1)
{
printf("%lld\n",cnt);
return;
}
cnt++;
print(pre[x]);
printf("%c",ans[x]);
}
inline void work(int u,int v,char dd)
{
if(pre[v]!=0) return;
pre[v]=u;
ans[v]=dd;
q.push_back(v);
if(v==ed){print(v);exit(0);}
}
void bfs(int st)
{
pre[st]=-1;
q.push_back(st);
int head=0;
while(head<q.size())
{
int u=q[head++];
work(u,A_(u),'A');
work(u,B_(u),'B');
work(u,C_(u),'C');
}
}
signed main()
{
t[0]=1;
for(int i=1;i<=8;++i) t[i]=t[i-1]*10;
for(int i=1,x;i<=8;++i)
{
scanf("%lld",&x);
if(i<=4) ed+=x*t[8-i];
else ed+=x*t[i-5];
}
if(ed!=12348765) bfs(12348765);
else printf("0");
}
Knight Moves



#include<bits/stdc++.h>
using namespace std;
const int N=305;
int t,n,stx,sty,edx,edy;
int d[N][N];
int dx[8]={-2,-2,-1,-1,1,1,2,2},dy[8]={1,-1,2,-2,2,-2,1,-1};
inline int id(int x,int y)
{
return x*N+y;
}
void bfs()
{
memset(d,0,sizeof(d));
d[stx][sty]=1;
vector<int>q;
q.push_back(id(stx,sty));
int head=0;
while(head<q.size())
{
int x=q[head]/N,y=q[head++]%N;
for(int i=0;i<8;++i)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&d[xx][yy]==0)
{
d[xx][yy]=d[x][y]+1;
q.push_back(id(xx,yy));
if(xx==edx&&yy==edy)
{
printf("%d\n",d[xx][yy]-1);
return;
}
}
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d %d %d",&n,&stx,&sty,&edx,&edy);
if(stx==edx&&sty==edy) printf("0\n");
else bfs();
}
}
棋盘游戏
#include<bits/stdc++.h>
using namespace std;
string s;
int st,ed,t[20];
vector<int>q;
map<int,int>d;
//y和z
void work(int x,int y,int z)
{
if((x>>y&1)==(x>>z&1)) return;
int v=(x>>y&1)?(x-t[y]+t[z]):(x+t[y]-t[z]);
if(d[v]) return;
d[v]=d[x]+1;
q.push_back(v);
if(v==ed)
{
printf("%d",d[v]-1);
exit(0);
}
}
void bfs()
{
d[st]=1;
q.push_back(st);
int head=0;
while(head<q.size())
{
int u=q[head++];
for(int i=15;i>=0;--i)
{
if(i%4) work(u,i,i-1);
if(i>3) work(u,i,i-4);
}
}
}
int main()
{
t[0]=1;
for(int i=1;i<=16;++i) t[i]=t[i-1]*2;
for(int i=1;i<=4;++i)
{
cin>>s;
for(int j=0;j<=3;++j) st=st*2+(s[j]=='1');
}
for(int i=1;i<=4;++i)
{
cin>>s;
for(int j=0;j<=3;++j) ed=ed*2+(s[j]=='1');
}
if(st==ed) printf("0");
else bfs();
}

浙公网安备 33010602011771号