第三周的主题为搜索算法
以下为搜索练习的题解记录(个人用于方便查找)
#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;
}
}