A* 合集

板子那篇烂尾了,等 \(25\)\(csp\) 时再继续写吧

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n,b[5000004];
int opt[5000003];
int x[5000004];
int a[5000004];
int y[5000004];
int len;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>opt[i]>>x[i];
		if(opt[i]==2) cin>>y[i];
	}	
	for(int i=0;i<=500005;i++) b[i]=i;
	for(int i=n;i>=1;i--){
		if(opt[i]==1){
			a[++len]=b[x[i]];
		}
		else{
			b[x[i]]=b[y[i]];
		}
	}
	for(int i=len;i>=1;i--){
		cout<<a[i]<<" ";
	}
}

  • 15数码问题

点击查看代码
#include<bits/stdc++.h>
using namespace std;
int t_x[16]={3,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3};
int t_y[16]={3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2};
int opt_x[5]={1,0,0,-1};
int opt_y[5]={0,-1,1,0};
int step[60];
char opt[6]={'D','L','R','U'};
int ans;
int b[10][10];
int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};
void dfs(int x,int y,int s,int stp,int r,int last){
	if(stp+s>r) return ;
	if(!s) {
		ans=stp;
		return ;
	}
	int sum=stp;
	for(int i=0;i<4;i++){
		if(last+i==3) continue;
		else{
			int x_=x+opt_x[i],y_=y+opt_y[i];
			if(x_<0||x_>3||y_<0||y_>3) continue;
			int now_s=s;
			int to=b[x_][y_];
			now_s+=abs(x-t_x[to]);
			now_s+=abs(y-t_y[to]);
			now_s-=abs(x_-t_x[to]);
			now_s-=abs(y_-t_y[to]);
			step[stp+1]=i;
			swap(b[x_][y_],b[x][y]);
			dfs(x_,y_,now_s,stp+1,r,i);
			if(ans!=1e9) return ;
			swap(b[x_][y_],b[x][y]);
		}
	}
	return ;
}
int T;
int c[100];
int main(){
	cin>>T;
	while(T--){
		int s_x,s_y;
		int num=0;
		int ok=0;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				scanf("%d",&b[i][j]);
				c[num]=b[i][j];
				if(b[i][j]==0) s_x=i,s_y=j,ok+=3-num/4;
				else for(int p=0;p<num;p++) if(c[p]>c[num]) ok++;
				num++;
			//	cout<<num<<endl;
			}
		}
		int sum=0;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				if(b[i][j]==a[i][j]||b[i][j]==0) continue;
				int k=b[i][j];
				sum+=abs(t_x[k]-i);
				sum+=abs(t_y[k]-j);
			}
		}
		ans=1e9;
		for(int i=sum;i;i++){
			dfs(s_x,s_y,sum,0,i,4);
			if(ans!=1e9) break;
		}
		cout<<ans<<endl;
	}	
}

点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct node{
	int w,to,nxt;
}z[1000003];
int H[1000003];
int h[1000003];
int h_[1000004];
int cnt;
void add(int x,int y,int w){
	z[++cnt].to=y;
	z[cnt].nxt=h[x];
	z[cnt].w=w;
	h[x]=cnt;
}
void ADD(int x,int y,int w){
	z[++cnt].to=y;
	z[cnt].nxt=h_[x];
	z[cnt].w=w;
	h_[x]=cnt; 
}
int vis[1000004];
int n,m,k;
int times[1000004];
typedef pair<int,int> pii;
typedef pair<int,pii> PII;
void dj(int s){
	for(int i=1;i<=n;i++) vis[i]=0,H[i]=1e9;
	priority_queue<pii,vector<pii>,greater<pii> > p;
	H[s]=0;
	p.push({0,s}); 
	while(!p.empty()){
		int x=p.top().second;
		p.pop();
		if(vis[x]) continue;
		else{
			vis[x]=1;
			for(int i=h_[x];i;i=z[i].nxt){
				int y=z[i].to;
				if(H[y]>H[x]+z[i].w){
					H[y]=H[x]+z[i].w;
					p.push({H[y],y});
				}
			}
		}
	}
} 
void A(){
	priority_queue<PII,vector<PII>,greater<PII> > p;
	p.push({H[n],{0,n}});
	while(!p.empty()){
		PII X=p.top();
		p.pop();
		int x=X.second.second;
		int dis=X.second.first;
		times[x]++;
		if(x==1){
			cout<<dis<<"\n";
			if(times[1]==k) return ;
			continue;
 		}
		for(int i=h[x];i;i=z[i].nxt){
			int y=z[i].to;
			if(times[y]<k){
				p.push({{z[i].w+dis+H[y]},{z[i].w+dis,y}});
			}
		}
	} 
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
		ADD(v,u,w);
	}
	dj(1);
//	for(int i=1;i<=n;i++) cout<<H[i]<<endl;
	A();
	for(int i=times[1]+1;i<=k;i++) cout<<"-1\n";
}

posted @ 2025-04-04 12:55  Distant_Cloud  阅读(17)  评论(0)    收藏  举报