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

来源:互联网 发布:windows启动盘制作 编辑:程序博客网 时间:2024/05/29 17:02

字串变换

这题用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 305using 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;}