工作室课题 第三周

第三周的主题为搜索算法

以下为搜索练习的题解记录(个人用于方便查找)

#include <iostream>
using namespace std;
struct dt {
    int x, y, a, b, id;
    dt() {}
    dt(int x, int y, int id) : x(x), y(y), id(id) {};
};
dt d[10010];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> d[i].x >> d[i].y >> d[i].a >> d[i].b;
        d[i].id = i + 1;
    }
    int x, y;
    cin >> x >> y;
   
    for (int i = n - 1; i >= 0; i--) {
        
        if (x >= d[i].x && x <= d[i].x + d[i].a && y >= d[i].y && y <= d[i].y + d[i].b) {
            cout << d[i].id;
            return 0;
        }
    }
    cout << -1;
    return 0;
}
#include<stdio.h> 
#include<string.h>
#include<stdlib.h>
#define Max_ 100005
#define min(a,b) a<b?a:b
int dp[Max_][12],head[Max_],m=0;
int n,s,k;
struct Edge{
    int tonode;
    int nextedge;
    int v;
}edge[Max_*2];
addedge(int fromnode,int tonode,int v1){
    edge[m].tonode=tonode;
    edge[m].nextedge=head[fromnode];
    edge[m].v=v1;
    head[fromnode]=m++;// fromnode
}
void dfs(int fromnode,int prenode){
     int i,j,remain;
     for(i=head[fromnode];i!=-1;i=edge[i].nextedge){
        int tonode=edge[i].tonode;
        if(tonode==prenode){
              continue;
        }
        dfs(tonode,fromnode);
        for(remain=k;remain>=0;remain--){
            dp[fromnode][remain]+=dp[tonode][0]+(edge[i].v)*2;
            for(j=1;j<=remain;j++){
                dp[fromnode][remain]=min(dp[fromnode][remain],dp[fromnode][remain-j]+dp[tonode][j]+j*(edge[i].v));
            } 
        }
     }   
}
int main(){
    memset(dp,0,sizeof(dp));
    int i,fromnode,tonode,v1;
    scanf("%d%d%d",&n,&s,&k);
    for(i=0;i<=n;i++){
        head[i]=-1;
    }
    for(i=1;i<n;i++){
        scanf("%d%d%d",&fromnode,&tonode,&v1);
      
        addedge(fromnode,tonode,v1);
        addedge(tonode,fromnode,v1);
    }
    dfs(s,0);
    printf("%d",dp[s][k]);
    return 0;
}

 

#include<iostream>  
#include<algorithm>  
#include<cstdio>  
#include<cmath>  
using namespace std;  
   
const int N=100000;  
struct P{int x,y;};  
bool cmp(P a,P b){  
    if(a.x==b.x)return a.y<b.y;  
    return a.x<b.x;  
}  
P d[N+5];  
struct F{int max,min;};  
F fl[N+5],fr[N+5];  
inline double Max(double a,double b){return a>b?a:b;}  
inline double Min(double a,double b){return a>b?b:a;}  
bool check(double m,int n){  
    m*=2;  
    int i,j=0;  
    for(i=0;i<n;i++){  
        while(j<n&&d[j].x-d[i].x<=m)j++;  
        double MAX=-1e10;  
        double MIN=1e10;  
        if(j!=n){  
            MAX=Max(MAX,fr[j].max);  
            MIN=Min(MIN,fr[j].min);  
        }  
        if(i-1>=0){  
            MAX=Max(MAX,fl[i-1].max);  
            MIN=Min(MIN,fl[i-1].min);  
        }  
     //   cout<<i<<" "<<j<<" "<<MAX<<" "<<MIN<<endl;  
        if(MAX-MIN<=m)return true;  
    }  
    return false;  
}  
void init(int n){  
    int i;  
    fl[0].min=fl[0].max=d[0].y;  
    for(i=1;i<n;i++){  
        fl[i].max=Max(fl[i-1].max,d[i].y); 
        fl[i].min=Min(fl[i-1].min,d[i].y);
    }  
    fr[n-1].min=fr[n-1].max=d[n-1].y;  
    for(i=n-2;i>=0;i--){  
        fr[i].max=Max(fr[i+1].max,d[i].y); 
        fr[i].min=Min(fr[i+1].min,d[i].y);  
    }  
}  
int main(){  
    int i,n;  
    cin>>n;  
    for(i=0;i<n;i++){  
        int x,y;  
        scanf("%d%d",&x,&y);  
        d[i].x=x+y;   
        d[i].y=x-y;  
    }  
    sort(d,d+n,cmp);  
    init(n);  
    double l=0.0;  
    double r=1000000000;  
    while(r-l>=0.01){  
        double m=(l+r)/2; 
      //  cout<<m<<endl;  
        if(check(m,n))r=m;  
        else l=m;  
    }  
    printf("%.1f\n",r);  
    return 0;  
}
#include <iostream>
#include <string.h>
using namespace std;
int cnt;
char map[100][105][105];
int vis[105][105];
int n[100],m[100];
int k;
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},
{1,0},{1,-1},{0,-1},{-1,-1}};
void blank(int q,int x,int y) 
{
    for(int i=0;i<8;i++)
    {
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(nx>=0&&nx<n[q]&&ny>=0&&ny<m[q])
        {
            if(map[q][nx][ny]=='*') continue;
            vis[nx][ny]++;
        }
    }
}
int main()
{
    while(1)
    {
        cin>>n[k]>>m[k];
        if(m[k]==0&&n[k]==0) break;
        for(int i=0;i<n[k];i++)
            for(int j=0;j<m[k];j++) 
                cin>>map[k][i][j];
        k++;
    }
    for(int q=0;q<k;q++)
    {
        cnt++;
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n[q];i++)
        {
            for(int j=0;j<m[q];j++)
            {
                if(map[q][i][j]=='*')
                {
                    vis[i][j]=-1;
                    blank(q,i,j);
                }
            }
        }
        cout<<"Field #"<<cnt<<":"<<endl;
        for(int i=0;i<n[q];i++)
        {
            for(int j=0;j<m[q];j++)
            {
                if(vis[i][j]==-1)
                {
                    cout<<"*";
                }
                else
                {
                    cout<<vis[i][j];
                }
            }
            cout<<endl;
        }
        cout<<endl;        
    }
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
int main(){
    char c,k=0;
    while((c=getchar())!=EOF){
        if(c=='/'){
            char d = getchar();
            if(d=='/'){
                while((c=getchar())!='\n');
                cout<<c;
            }
            else if(d=='*'){
                char e=0;
                while((c=getchar())!='/'||e!='*')
                    e=c;       
            }
            else
                cout<<c<<d;
        }
        else
            cout<<c;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值