搜索 传染病控制 靶形数独 字串变换

字串变换

这题用string比较简单,string有许多自带函数和性质比较方便,如果用char的话比较麻烦,可是在做这道题的时候不知道这些,然后用char打了个超级麻烦的代码

string支持两个字符串直接相加

s.insert(pos,s2) 

s.substr(pos,len);

s.erase(pos,len);

s.replace(pos,len,s2);

s.find(s2,pos) 如果查找不到返回string::nops

靶形数独

这道题比较简单,dfs参数代表搜到第几个空位置,每一层dfs枚举9--1,然后搜到x==num+1是,ans取max

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<algorithm>
using namespace std;
int a[10][10],be[10][10],c[10][10];
bool lvis[10][10],hvis[10][10],vis[10][10];
struct node
{
     int x,y;
}t[88];
int num=0,ans;
int cmp(const node &a,const node &b)
{
    return a.y==b.y? a.x<b.x : a.y<b.y;
}
void pre()
{
    c[1][1]=6;c[1][2]=6;c[1][3]=6;c[1][4]=6;c[1][5]=6; c[1][6]=6;c[1][7]=6;c[1][8]=6;c[1][9]=6;
    c[2][1]=6;c[2][2]=7;c[2][3]=7;c[2][4]=7;c[2][5]=7; c[2][6]=7;c[2][7]=7;c[2][8]=7;c[2][9]=6;
    c[3][1]=6;c[3][2]=7;c[3][3]=8;c[3][4]=8;c[3][5]=8; c[3][6]=8;c[3][7]=8;c[3][8]=7;c[3][9]=6;
    c[4][1]=6;c[4][2]=7;c[4][3]=8;c[4][4]=9;c[4][5]=9; c[4][6]=9;c[4][7]=8;c[4][8]=7;c[4][9]=6;
    c[5][1]=6;c[5][2]=7;c[5][3]=8;c[5][4]=9;c[5][5]=10;c[5][6]=9;c[5][7]=8;c[5][8]=7;c[5][9]=6;
    c[6][1]=6;c[6][2]=7;c[6][3]=8;c[6][4]=9;c[6][5]=9; c[6][6]=9;c[6][7]=8;c[6][8]=7;c[6][9]=6;
    c[7][1]=6;c[7][2]=7;c[7][3]=8;c[7][4]=8;c[7][5]=8; c[7][6]=8;c[7][7]=8;c[7][8]=7;c[7][9]=6;
    c[8][1]=6;c[8][2]=7;c[8][3]=7;c[8][4]=7;c[8][5]=7; c[8][6]=7;c[8][7]=7;c[8][8]=7;c[8][9]=6;
    c[9][1]=6;c[9][2]=6;c[9][3]=6;c[9][4]=6;c[9][5]=6; c[9][6]=6;c[9][7]=6;c[9][8]=6;c[9][9]=6;
}
void read()
{
     for(int i=1;i<=3;i++)
       for(int j=1;j<=9;j++) 
       {
           if(j<=3) {be[i][j]=1;continue;}
           if(j<=6) {be[i][j]=4;continue;}
           if(j<=9) {be[i][j]=7;continue;}
       }
     for(int i=4;i<=6;i++)
       for(int j=1;j<=9;j++)
       {
           if(j<=3) {be[i][j]=2;continue;}
           if(j<=6) {be[i][j]=5;continue;}
           if(j<=9) {be[i][j]=8;continue;}    
       }
     for(int i=7;i<=9;i++)
       for(int j=1;j<=9;j++)
       {
           if(j<=3) {be[i][j]=3;continue;}
           if(j<=6) {be[i][j]=6;continue;}
           if(j<=9) {be[i][j]=9;continue;}    
       }
     for(int i=1;i<=9;i++)
      for(int j=1;j<=9;j++){ 
        scanf("%d",&a[i][j]);
        if(a[i][j]!=0) lvis[j][a[i][j]]=1;hvis[i][a[i][j]]=1;vis[be[i][j]][a[i][j]]=1;
        if(a[i][j]==0) { num++;t[num].x=i;t[num].y=j; }
      }
     sort(t+1,t+num+1,cmp);
}
int op=0;
void dfs(int now)
{
    if(now==num+1){ ans=max(ans,op); return ; }
    int x=t[now].x,y=t[now].y;
    for(int i=9;i>=1;i--)
    if(lvis[y][i]==0&&hvis[x][i]==0&&vis[be[x][y]][i]==0){
       lvis[y][i]=1; hvis[x][i]=1; vis[be[x][y]][i]=1;
       op+=c[x][y]*i;
       dfs(now+1);
       lvis[y][i]=0; hvis[x][i]=0; vis[be[x][y]][i]=0;
       op-=c[x][y]*i;
    }
}
int main()
{
    pre();
    read();
    ans=-1;
    dfs(1);
    if(ans==-1) printf("%d",ans);
    else{
     for(int i=1;i<=9;i++)
      for(int j=1;j<=9;j++)
       if(a[i][j]) ans+=a[i][j]*c[i][j];
     printf("%d",ans);
    }
    return 0;
}

传染病控制

bfs按深度记录节点,传染病会随着深度扩散,显然每层深度的所有节点中只有一个节点到他父亲的边会被切断,

对于一个节点如果他到他父亲的边被切断,标记一下,然后搜到每一层的时候,先下传标记,即

if(vis[fa[x]]==1) vis[x]=1;

用这一层节点数-被标记的点数-1就是这一层会被感染的节点数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
#define maxn 305
using namespace std;
int n,p;
int ans,maxdeep,op=0;
struct edge
{
    int to,ne;  
}b[maxn*2];
vector< int > v[maxn];
int k=0,head[maxn],fa[maxn],d[maxn],sz[maxn];
bool vis[maxn];
int cmp(const int &a,const int &b){
    return sz[a]>sz[b];
}
void dfs1(int x,int father,int deep)
{
     fa[x]=father;sz[x]=1;d[x]=deep;
     v[deep].push_back(x);
     for(int i=head[x];i!=-1;i=b[i].ne)
      if(b[i].to!=fa[x]){ dfs1(b[i].to,x,deep+1);  sz[x]+=sz[b[i].to]; }
     maxdeep=max(maxdeep,deep);
}
void add(int u,int v)
{
     k++;
     b[k].to=v;b[k].ne=head[u];head[u]=k;
}
void read()
{
     memset(head,-1,sizeof(head));
     scanf("%d%d",&n,&p);
     int x,y;
     for(int i=1;i<=p;i++){
        scanf("%d%d",&x,&y);
        add(x,y); add(y,x);
     }
     dfs1(1,0,0);
     for(int i=1;i<=maxdeep;i++)
      sort(v[i].begin(),v[i].end(),cmp); 
}
void dfs(int x)
{
     if(op>ans) return;
     if(x>maxdeep){ ans=min(op,ans);  return; }
     if(v[x].empty()==1) return ; 
     int js=0;
     for(int i=0;i<v[x].size();i++)
     {
        int t=v[x][i];
        if(vis[fa[t]]==1) vis[v[x][i]]=1;
        if(vis[v[x][i]]==0) js++;     
     }
     if(js==0) ans=min(ans,op); 
     for(int i=0;i<v[x].size();i++)
        if(vis[v[x][i]]==0){
           op+=(js-1);
           vis[v[x][i]]=1;
           dfs(x+1);
           op-=(js-1);
           vis[v[x][i]]=0;
        } 
     for(int i=0;i<v[x].size();i++)
     {
        int t=v[x][i];
        if(vis[fa[t]]==1) vis[v[x][i]]=0;
     }
}
int main()
{
     read();
     ans=n;op=1;
     dfs(1);
     printf("%d",ans);
     return 0;
}
 




posted @ 2017-08-09 21:07  HunterxHunterl  阅读(121)  评论(0编辑  收藏  举报