搜索 传染病控制 靶形数独 字串变换
字串变换
这题用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; }