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();
	}
}

棋盘游戏

image-20200902112846929

image-20200902112859225

#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();
}
posted @ 2020-10-23 19:43  林生。  阅读(175)  评论(0)    收藏  举报