搜索进阶

Eight

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
using namespace std;
const int N=362885;
int fac[]={1,1,2,6,24,120,720,5040,40320,362880};
struct node{
	string path;
	int hashs;
	int pos;
};
node now,net;
queue<node>q;
int dt[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char op[5] = "udlr";
int tmp[9];
int result=46234;
string path[N];
int vis[N];
int cantor(int *a){//康拓展开
	int x=0;
	for(int i=0;i<9;i++){
		int sma=0;
		for (int j = i + 1; j < 9; ++j){
			if (a[j] < a[i])
				sma++;
		}
		x += fac[9 - i - 1] * sma;
	} 
	return x + 1;
} 
//逆康拓展开 
void decantor(int x,int *a){
	vector<int>v;
	for (int i = 0; i < 9; i++){
		v.push_back(i);
	}
	for (int i = 0; i < 9; i++){
		int r = x % fac[9 - i -1];
		int t = x / fac[9 - i -1];
		x = r;
		sort(v.begin(),v.end());
		a[i] = v[t];
		v.erase(v.begin() + t);
	}
}
void bfs(){
	memset(vis,0,sizeof(vis));
	for (int i = 0; i < 8; i++)
		tmp[i+1] = i+1;
	tmp[8] = 0;
	now.pos = 8;
	now.hashs = result;
	now.path = "";
	path[result]="";
	vis[result] = 1;
	q.push(now);
	while(!q.empty()){
		now = q.front();
		q.pop();
		for (int i = 0; i < 4; i++){
			int tx = now.pos / 3 + dt[i][0];
			int ty = now.pos % 3 + dt[i][1];
			if (tx >= 0 && ty >= 0 && tx <= 2 && ty <= 2){
				net = now;
				net.pos = tx * 3 + ty;
				decantor(now.hashs-1,tmp);
				swap(tmp[now.pos],tmp[net.pos]);
				net.hashs = cantor(tmp);
				if(!vis[net.hashs]){
					vis[net.hashs] = 1;
					net.path = op[i] + net.path;
					q.push(net);
					path[net.hashs] = net.path;
				} 
			}
		}
	}
	return ; 
}
int main()
{
    bfs();
    char x;
    while(cin>>x)//输入格式 没啥说的
    {
        if(x=='x')
        {
            now.pos=0;
            tmp[0]=0;
        }
        else
        {
            tmp[0]=x-'0';
        }
        for(int i=1; i<9; i++)
        {
            cin>>x;
            if(x=='x')
            {
                now.pos=i;
                tmp[i]=0;
            }
            else
            {
                tmp[i]=x-'0';
            }
        }
        now.hashs=cantor(tmp);//求出tmp这个拼图序列的hash值
        if(!vis[now.hashs])//这个hash没标记过,即没产生过这个拼图序列
            cout<<"unsolvable"<<endl;
        else
            cout<<path[now.hashs]<<endl;//输出hash的路径
    }
    return 0;
}

Eight II 

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
using namespace std;
const int INF = 1e8;
const int MAXN = 4e5;
int n,m;
char eight_num[9][10] = {"X12345678","1X2345678","12X345678","123X45678","1234X5678","12345X678",
                         "123456X78","1234567X8","12345678X"};
char step[] = "dlru";
int dx[4] = {1,0,0,-1};
int dy[4] = {0,-1,1,0};
int fac[9] = {1,1,2,6,24,120,720,5040,40320};
int vis[9][MAXN];
int pre[9][MAXN];
struct node{
    int num[9];//八数码
    int state;//状态(康托展开值)
    int pos;//x的位置
};
//得到状态
int Cantor(int *s){
    int sum = 0;
    for(int i = 0; i < 9; i++){
        int num = 0;
        for(int j = i+1; j < 9; j++){
            if(s[i] > s[j]) num++;
        }
        sum += num * fac[8-i];
    }
    return sum;
}
void printAns(int state,int kind){
    string ans;
    while(state != -1){
        ans += step[vis[kind][state]];
        state = pre[kind][state];
    }
    printf("%d\n",ans.size()-1);
    for(int i = ans.size() - 2; i >= 0; i--){
        printf("%c",ans[i]);
    }
    puts("");
}
void bfs(node x,int kind){
    queue<node> q;
    q.push(x);
    vis[kind][x.state] = 1;//这个是初始化的值并不是真正走的值所以上面输出的时候是从倒数第二个开始输出
    while(!q.empty()){
        node u = q.front();
        q.pop();
        //4种交换
        int x = u.pos / 3;
        int y = u.pos % 3;
        for(int i = 0; i < 4; i++){
            int xx = x + dx[i];
            int yy = y + dy[i];
            if(xx >= 0 && xx < 3 && yy >= 0 && yy < 3){
                node v = u;
                swap(v.num[u.pos],v.num[xx*3+yy]);
                v.state = Cantor(v.num);
                if(vis[kind][v.state] == -1){
                    v.pos = xx * 3 + yy;
                    vis[kind][v.state] = i;//代表通过i方向的移动到达kind这类中的v.state状态
                    pre[kind][v.state] = u.state;//记录这种状态的前一种状态
                    q.push(v);
                }
            }
        }
    }
}
void init(char *s,int kind){
    node u;
    for(int i = 0; i < 9; i++){
        if(s[i] == 'X'){
            u.num[i] = 0;
            u.pos = i;
        }
        else u.num[i] = s[i] - '0';
    }
    u.state = Cantor(u.num);
    bfs(u,kind);
}
int main(){
    int t,cas = 0;
    char s[15],c[15];
    int kind;
    int temp[MAXN];
    memset(vis,-1,sizeof(vis));
    memset(pre,-1,sizeof(pre));
    for(int i = 0; i < 9; i++){
        init(eight_num[i],i);
    }
    scanf("%d",&t);
    while(t--){
        scanf("%s",s);
        int cnt = 1;
        //映射初始状态的八数码
        for(int i = 0; i < 9; i++){
            if(s[i] == 'X'){
                c[0] = 0;
                kind = i;
            }
            else c[s[i]-'0'] = cnt++;
        }
        //映射目标状态八数码
        scanf("%s",s);
        for(int i = 0; i < 9; i++){
            if(s[i] == 'X') temp[i] = c[0];
            else temp[i] = c[s[i]-'0'];
        }
        int state = Cantor(temp);
        printf("Case %d: ",++cas);
        printAns(state,kind);
    }
    return 0;
}

哈密顿绕行世界问题 

#include<bits/stdc++.h>
using namespace std;
int a[25][3];
int vis[25],cnt=1,ans[25];
void dfs(int q,int l,int p){
	ans[l]=q;
	vis[q]=1;
	for(int i=0;i<3;i++){
		int t=a[q][i];
		if(t==p&&l==19){
			printf("%d:  ",cnt++);
			for(int j=0;j<20;j++)
				printf("%d ",ans[j]);
			printf("%d\n",p);
		}
		if(!vis[t])
			dfs(t,l+1,p);
	}
	vis[q]=0;
}
int main(){
	for(int i=1;i<=20;i++)
		scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]);
	int m;
	while(~scanf("%d",&m)&&m){
		memset(vis,0,sizeof(vis));
		dfs(m,0,m);
	}
	return 0;
} 

Just a String

 

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll __int64
using namespace std ;
const int maxn = 111111 ;
 
int min ( int a , int b ) { return a < b ? a : b ; }
int f[maxn] ;
int dp[22][maxn] ;
ll sum[maxn] ;
 
char s1[maxn] ;
int s[maxn] ;
 
struct Suf{
    int wa[maxn] , wb[maxn] , ws[maxn] , wv[maxn] ;
    int rank[maxn] , hei[maxn] , sa[maxn] ;
 
    int cmp ( int *r , int i , int j , int l ){ return r[i] == r[j] && r[i+l] == r[j+l] ; }
 
    void da ( int *r , int n , int m ){
            int *x = wa , *y = wb , *t ;
        int i , j , k , p ;
        for ( i = 0 ; i < m ; i ++ ) ws[i] = 0 ;
        for ( i = 0 ; i < n ; i ++ ) ws[x[i]=r[i]] ++ ;
        for ( i = 1 ; i < m ; i ++ ) ws[i] += ws[i-1] ;
        for ( i = n - 1 ; i >= 0 ; i -- ) sa[--ws[x[i]]] = i ;
        for ( j = 1 , p = 1 ; p < n ; j *= 2 , m = p ) {
            for ( p = 0 , i = n - j ; i < n ; i ++ ) y[p++] = i ;
            for ( i = 0 ; i < n ; i ++ ) if ( sa[i] >= j ) y[p++] = sa[i] - j ;
            for ( i = 0 ; i < m ; i ++ ) ws[i] = 0 ;
            for ( i = 0 ; i < n ; i ++ ) ws[x[i]] ++ ;
            for ( i = 1 ; i < m ; i ++ ) ws[i] += ws[i-1] ;
            for ( i = n - 1 ; i >= 0 ; i -- ) sa[--ws[x[y[i]]]] = y[i] ;
            for ( t = x , x = y , y = t ,x[sa[0]] = 0 , p = 1 , i = 1 ; i < n ; i ++ )
                x[sa[i]] = cmp ( y , sa[i-1] , sa[i] , j ) ? p - 1 : p ++ ;
        }
        k = 0 ;
        for ( i = 1 ; i < n ; i ++ ) rank[sa[i]] = i ;
        for ( i = 0 ; i < n - 1 ; hei[rank[i++]] = k )
            for ( k ? k -- : 0 , j = sa[rank[i]-1] ; r[i+k] == r[j+k] ; k ++ ) ;
    }
 
	int min_hei ( int x , int y ) {
		return ( hei[x] < hei[y] ? x : y ) ;
	}
 
    void rmq ( int n ) {
        int i , j ;
        for ( i = 1 ; i <= n ; i ++ ) dp[0][i] = i ;
        for ( i = 1 ; i <= 20 ; i ++ )
            for ( j = 1 ; j + ( 1 << i ) - 1 <= n ; j ++ )
                dp[i][j] = min_hei ( dp[i-1][j] , dp[i-1][j+(1<<(i-1))] ) ;
    }
 
    int query ( int l , int r ) {
        if ( l > r ) swap ( l , r ) ;
        l ++ ;//要从height[l+1]到height[r]之间求最小值
        if ( l == r ) return dp[0][l] ;
        int k = r - l + 1 ;
        return min_hei ( dp[f[k]][l] , dp[f[k]][r-(1<<f[k])+1] ) ;
    }
 
    void solve ( int n , ll k ) {
		rmq ( n ) ;
		int l = 1 , r = n  , i;
		sum[0] = 0 ;
		for ( i = 1 ; i <= n ; i ++ )
			sum[i] = sum[i-1] + n - sa[i] ;
		int h = 0 ;
		int pos = 0 , len ;
		while ( l < r ) {
			int mid = query ( l , r ) - 1 ;
//			printf ( "l = %d , r = %d mid = %d , k = %I64d , fuck = %d\n" , l , r , mid , k , ( hei[mid] - h ) * ( r - l + 1 ) ) ;
			if ( k <= (ll) ( hei[mid+1] - h ) * ( r - l + 1 ) ) {
				pos = l ;
				len = h + k / ( r - l + 1 ) + ( k % ( r - l + 1 ) != 0 ) ;
//				printf ( "pos = %d , l = %d\n" , pos , len ) ;
				break ;
			}
			k -= (ll) (hei[mid+1] - h ) * ( r - l + 1 ) ;
			if ( k <= sum[mid] - sum[l-1] - (ll) hei[mid+1] * ( mid - l + 1 ) ) {
				r = mid ;
			}
			else {
				k -= sum[mid] - sum[l-1] - (ll) hei[mid+1] * ( mid - l + 1 ) ;
				l = mid + 1 ;
			}
			h = hei[mid+1] ;
		}
		if ( !pos ) pos = l , len = h + k ;
		for ( i = 0 ; i < len ; i ++ )
			printf ( "%c" , s[sa[pos]+i] ) ;
		puts ( "" ) ;
    }
 
} arr ;
 
int main () {
    int cas , i , j , ca = 0 ;
    ll m ;
    j = 0 ;
    for ( i = 1 ; i < maxn - 1111 ; i ++ ) {
        if ( i > 1 << j + 1 ) j ++ ;
        f[i] = j ;
    }
    scanf ( "%d" , &cas ) ;
    while ( cas -- ) {
        scanf ( "%s" , s1 ) ;
        scanf ( "%I64d" , &m ) ;
        int len = strlen ( s1 ) ;
        for ( i = 0 ; i < len ; i++ ) s[i] = s1[i] ;
        s[len] = 0 ;
        arr.da ( s , len + 1 , 411 ) ;
        printf ( "Case %d: " , ++ ca ) ;
        arr.solve ( len , m ) ;
    }
}

DNA sequence

#include<bits/stdc++.h>
using namespace std;
struct node{
	string s;
	int len;
}a[10];
string c="ACGT";
int n,depth,t,k,pos[10];
int get(){
	int ans=0;
	for(int i=0;i<n;i++)
		ans=max(ans,a[i].len-pos[i]);
	return ans;
}
int dfs(int step){
	if(step+get()>depth)
		return 0;
	if(!get())	
		return 1;
	int temp[10];
	for(int i=0;i<n;i++)
		temp[i]=pos[i];
	for(int i=0;i<4;i++){
		int flag=0;
		for(int j=0;j<n;j++){
			if(a[j].s[pos[j]]==c[i]){
				flag=1;
				pos[j]++;
			}
		}
		if(flag){
			if(dfs(step+1))
				return 1;
			for(int j=0;j<n;j++)
				pos[j]=temp[j];
		}
	}
	return 0;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		depth=0;
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			cin>>a[i].s;
			a[i].len=a[i].s.size();
			depth=max(depth,a[i].len);
			pos[i]=0;
		}
		while(1){
			if(dfs(0))
				break;
			depth++;
		}
		printf("%d\n",depth);
		
	}
	return 0;
}

Nightmare Ⅱ 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n,m,step;
char mp[maxn][maxn];
int dt[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
	int x,y;
};
node now,nxt;
node zz[2],mm,gg;
queue<node>q[2];
queue<node>qt;
int check(node tmp){
	for(int i=0;i<2;i++){
		if(abs(tmp.x-zz[i].x)+abs(tmp.y-zz[i].y)<=step*2||mp[tmp.x][tmp.y]=='X'||mp[tmp.x][tmp.y]=='\0')
			return 0;
	}
	return 1;
}
int bfs(int pos,int step,char st,char en){
	qt=q[pos];
	for(int j=0;j<step;j++){
		while(!qt.empty()){
			now=qt.front();
			qt.pop();
			q[pos].pop();
			if(!check(now))
				continue;
			for(int i=0;i<4;i++){
				nxt.x=now.x+dt[i][0];
				nxt.y=now.y+dt[i][1];
				if(!check(nxt)||mp[nxt.x][nxt.y]==st)
					continue;
				if(mp[nxt.x][nxt.y]==en)
					return 1;
				mp[nxt.x][nxt.y]=st;
				q[pos].push(nxt);
			}
		}
		qt=q[pos];
	}
	return  0;
}
int solve(){
	step=0;
	while(!q[0].empty())
		q[0].pop();
	while(!q[1].empty())
		q[1].pop();
	while(!qt.empty())
		qt.pop();
	q[0].push(mm);
	q[1].push(gg);
	while(!q[0].empty()&&!q[1].empty()){
		step++;
		if(bfs(0,3,'M','G')||bfs(1,1,'G','M'))
			return step;
	}
	return -1;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);
		memset(mp,'X',sizeof(mp));
		for(int cnt=0,i=1;i<=n;i++){
			scanf("%s",mp[i]+1);
			for(int j=1;j<=m;j++){
				if(mp[i][j]=='M'){
					mm.x=i;
					mm.y=j;
				}
				if(mp[i][j]=='G'){
					gg.x=i;
					gg.y=j;
				}
				if(mp[i][j]=='Z'){
					zz[cnt].x=i;
					zz[cnt++].y=j;
				}
			}
		}
		printf("%d\n",solve());
	}
}

A计划

#include<bits/stdc++.h>
using namespace std;
char mp[2][15][15];
int vis[2][15][15];
struct node{
	int x,y,z,step;
};
node now,net;
int dt[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int n,m,t;
void bfs(){
	queue<node>q;
	memset(vis,0,sizeof(vis));
	int f=0;
	now.x=0,now.y=0,now.z=0,now.step=0;
	vis[0][0][0]=1;
	q.push(now);
	while(!q.empty()){
		now=q.front();
		q.pop();
		if(mp[now.z][now.x][now.y]=='#'){
			now.z=1-now.z;
			vis[now.z][now.x][now.y]=1;
			if(mp[now.z][now.x][now.y]=='#'||mp[now.z][now.x][now.y]=='*')
				continue;
		}
		if(mp[now.z][now.x][now.y]=='P'&&now.step<=t){
			f=1;
			printf("YES\n");
			break;
		}
		for(int i=0;i<4;i++){
			net.z=now.z;
			net.x=now.x+dt[i][0];
			net.y=now.y+dt[i][1];
			net.step=now.step+1;
			if(!vis[net.z][net.x][net.y]&&mp[net.z][net.x][net.y]!='*'&&net.x>=0&&net.x<n&&net.y>=0&&net.y<m){
				vis[net.z][net.x][net.y]=1;
				q.push(net);
			}
		}
	}
	if(!f)
		printf("NO\n");
}
int main(){
	int c;
	scanf("%d",&c);
	while(c--){
		scanf("%d%d%d",&n,&m,&t);
		for(int i=0;i<2;i++)
			for(int j=0;j<n;j++)
				for(int k=0;k<m;k++)
					cin>>mp[i][j][k];
		bfs();
	}
	return 0;
}

Travelling

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dp[60000][11],thr[11],dig[60000][11],tu[15][15],n,m;
const int inf=0x3f3f3f3f;
void init(){
	thr[0]=1;
	for(int i=1;i<11;i++)
		thr[i]=thr[i-1]*3;
	for(int i=0;i<thr[10];i++){
		int tem=i;
		for(int j=0;j<10;j++){
			dig[i][j]=tem%3;
			tem/=3;
		}
	}
}
int main(){
	init();
	while(~scanf("%d%d",&n,&m)){
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				tu[i][j]=inf;
		for(int i=0;i<thr[n];i++)
			for(int j=0;j<n;j++)
				dp[i][j]=inf;
		while(m--){
			int a,b,c;
			scanf("%d%d%d",&a,&b,&c);
			tu[a-1][b-1]=tu[b-1][a-1]=min(c,tu[a-1][b-1]);
		}
		for(int i=0;i<n;i++)
			dp[thr[i]][i]=0;
		int ans=inf;
		for(int j=0;j<thr[n];j++){
			int flag=1;
			for(int i=0;i<n;i++){
				if(dig[j][i]==0)
					flag=0;
				if(dp[j][i]!=inf)
					for(int k=0;k<n;k++)
						if(tu[i][k]!=inf&&dig[j][k]!=2)
							dp[j+thr[k]][k]=min(dp[j][i]+tu[i][k],dp[j+thr[k]][k]);
			}
			if(flag)
				for(int i=0;i<n;i++)
					ans=min(ans,dp[j][i]); 
		}
		if(ans>=inf)
			puts("-1");
		else printf("%d\n",ans);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值