图的邻接矩阵表示
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum;
int a[55][55],b[55];
int main(){
cin>>n>>k;
for(int i=2;i<=k+1;i++){
cin>>x>>y>>z;
a[x][y]=z;
a[y][x]=z;
}
cin>>t;
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i][t]!=0){
b[++sum]=i;
cnt++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<cnt<<" ";
for(int i=1;i<=sum;i++){
cout<<b[i]<<" ";
}
return 0;
}
图的邻接矩阵表示2
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum;
int a[55][55],b[55];
int main(){
cin>>n>>k;
for(int i=2;i<=k+1;i++){
cin>>x>>y>>z;
a[x][y]=z;
}
cin>>t;
int cnt=0;
for(int i=1;i<=n;i++){
if(a[t][i]!=0){
b[++sum]=i;
cnt++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<cnt<<" ";
for(int i=1;i<=sum;i++){
cout<<b[i]<<" ";
}
return 0;
}
图的邻接矩阵表示3
#include<iostream>
#include<iomanip>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<stack>
using namespace std;
int n,k,x,y,z,t,sum,rer;
int a[55][55],b[55],c[55];
int main(){
cin>>n>>k;
for(int i=2;i<=k+1;i++){
cin>>x>>y>>z;
a[x][y]=z;
}
cin>>t;
int cnt=0,ans=0;
for(int i=1;i<=n;i++){
if(a[t][i]!=0){
b[++sum]=i;
cnt++;
}
}
for(int i=1;i<=n;i++){
if(a[i][t]!=0){
c[++rer]=i;
ans++;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
cout<<cnt<<" ";
sort(b+1,b+sum+1);
for(int i=sum;i>=1;i--){
cout<<b[i]<<" ";
}
cout<<endl;
cout<<ans<<" ";
sort(c+1,c+rer+1);
for(int i=rer;i>=1;i--){
cout<<c[i]<<" ";
}
cout<<endl;
cout<<ans+cnt;
return 0;
}
图的前向星表示1
#include<bits/stdc++.h>
using namespace std;
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int main(){
cin>>n>>m;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++){
cout<<i<<":"<<" ";
for(int j=head[i];j!=-1;j=nxt[j]){
cout<<ver[j]<<" ";
}
if(head[i]==-1){
cout<<"zero";
}
cout<<endl;
}
return 0;
}
图的前向星表示2
#include<bits/stdc++.h>
using namespace std;
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int main(){
cin>>n>>m;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++){
cout<<i<<":"<<" ";
for(int j=head[i];j!=-1;j=nxt[j]){
cout<<ver[j]<<" ";
}
if(head[i]==-1){
cout<<"zero";
}
cout<<endl;
}
return 0;
}
图的前向星表示3
#include<bits/stdc++.h>
using namespace std;
long long x,y,m,n,head[110000],ver[110000],nxt[110000],tot,t[110000],cnt;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
int main(){
cin>>n>>m;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
}
for(int i=1;i<=n;i++){
cnt=0;
cout<<i<<":"<<" ";
for(int j=head[i];j!=-1;j=nxt[j]){
t[++cnt]=ver[j];
}
sort(t+1,t+1+cnt);
for(int j=1;j<=cnt;j++){
cout<<t[j]<<" ";
}
if(head[i]==-1){
cout<<"zero";
}
cout<<endl;
}
return 0;
}
图的前向星表示4
#include<bits/stdc++.h>
using namespace std;
long long head[110000],ver[110000],nxt[110000],tot,quan[110000];
void add(int x,int y,int z){
tot++;
ver[tot]=y;
quan[tot]=z;//权值
nxt[tot]=head[x];//插入到head[x]表头上
head[x]=tot;
}
int main(){
long long x,y,z,m,n;
cin>>n>>m;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
cin>>x>>y>>z;
add(x,y,z);
}
for(int i=1;i<=n;i++){
cout<<i<<":"<<" ";
for(int j=head[i];j!=-1;j=nxt[j]){
cout<<"(";
cout<<ver[j];
cout<<",";
cout<<quan[j];
cout<<")"<<" ";
}
if(head[i]==-1){
cout<<"zero";
}
cout<<endl;
}
return 0;
}
找树根和孩子
#include<bits/stdc++.h>
using namespace std;
int a[110],b[110],maxx,f;
int main(){
int n,m,x,y;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x>>y;
a[y]=x;
b[x]++;
}
for(int i=1;i<=n;i++){
if(a[i]==0){
cout<<i<<endl;
}
}
for(int i=1;i<=n;i++){
if(b[i]>maxx){
maxx=b[i];
f=i;
}
}
cout<<f<<endl;
for(int i=1;i<=n;i++){
if(a[i]==f){
cout<<i<<" ";
}
}
return 0;
}
二叉树的遍历
#include<bits/stdc++.h>
using namespace std;
int n,x,a[1100],b[1100],cnt;
void zx(int root){
if(a[root*2]!=0){
zx(root*2);
}
b[++cnt]=a[root];
if(a[root*2+1]!=0){
zx(root*2+1);
}
}
int main(){
cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
}
zx(1);
b[0]=-1;
for(int i=1;i<=cnt;i++){
if(b[i]==x){
cout<<b[i-1]<<"\n";
}
}
return 0;
}
联通森林1
#include<bits/stdc++.h>
using namespace std;
int ver[1100000],nxt[1100000],head[1100000],tot,vis[1100000];
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dfs(ver[i]);
}
}
}
int main(){
int n,m,x,y;
cin>>n>>m;
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
int cnt=0;
for(int i=1;i<=n;i++){
if(vis[i]==0){
dfs(i);
cnt++;
}
}
cout<<cnt;
return 0;
}
联通森林2
#include<bits/stdc++.h>
using namespace std;
long long ver[2200000],nxt[2200000],head[1100000],tot,vis[1100000],sum=0;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=sum;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dfs(ver[i]);
}
}
}
int main(){
int n,m,x,y,q;
scanf("%d%d%d",&n,&m,&q);
memset(head,-1,sizeof head);
for(int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
sum++;
dfs(i);
}
}
int a,b;
for(int i=1;i<=q;i++){
scanf("%d%d",&a,&b);
if(vis[a]==vis[b]){
printf("Yes");
printf("\n");
}
else{
printf("No");
printf("\n");
}
}
return 0;
}
美国血统问题
#include<bits/stdc++.h>
using namespace std;
string q,z;
void s(string q,string z){
char c=q[0];
int r=z.find(c);
string zq=q.substr(1,r);
string zz=z.substr(0,r);
string yq=q.substr(r+1,q.size()-r-1);
string yz=z.substr(r+1,z.size()-r-1);
if(r>0){
s(zq,zz);
}
if(r<z.size()-1){
s(yq,yz);
}
cout<<c;
}
int main(){
cin>>z>>q;
s(q,z);
return 0;
}
FBI树
#include<bits/stdc++.h>
using namespace std;
string s;
void hx(int l,int r){
if(l<r){
int mid=(l+r)/2;
hx(l,mid);
hx(mid+1,r);
}
int f0=0,f1=0;
for(int i=l;i<=r;i++){
if(s[i]=='0'){
f0=1;
}
else{
f1=1;
}
}
if(f0==1&&f1==1){
cout<<"F";
}
else if(f0==0&&f1==1){
cout<<"I";
}
else if(f0==1&&f1==0){
cout<<"B";
}
}
int main(){
int n;
cin>>n;
cin>>s;
hx(0,s.size()-1);
return 0;
}
吝啬的国度
#include<bits/stdc++.h>
using namespace std;
int n,s,x,y;
long long ver[220000],nxt[220000],head[110000],vis[110000],f[110000],tot,sum=0;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
f[ver[i]]=x;
dfs(ver[i]);
}
}
}
int main(){
cin>>n>>s;
memset(head,-1,sizeof head);
for(int i=1;i<=n-1;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
f[s]=-1;
dfs(s);
for(int i=1;i<=n;i++){
cout<<f[i]<<" ";
}
return 0;
}
儿子个数统计1
#include<bits/stdc++.h>
using namespace std;
int n,a[2200000];
int main(){
int x,y;
cin>>n;
for(int i=1;i<=n-1;i++){
cin>>x>>y;
a[x]++;
}
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
return 0;
}
儿子个数统计2
#include<bits/stdc++.h>
using namespace std;
int n,a[1100000];
int main(){
int x,y;
cin>>n;
for(int i=1;i<=n-1;i++){
cin>>x>>y;
a[x]++;
a[y]++;
}
cout<<a[1]<<" ";
for(int i=2;i<=n;i++){
cout<<a[i]-1<<" ";
}
return 0;
}
树的深度
#include<bits/stdc++.h>
using namespace std;
long long x,y,s,n,head[1100000],ver[1100000],nxt[1100000],dep[2200000],tot,vis[1100000];
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dep[ver[i]]=dep[x]+1;
dfs(ver[i]);
}
}
}
int main(){
cin>>n>>s;
memset(head,-1,sizeof head);
for(int i=1;i<=n-1;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
vis[s]=0;
dfs(s);
for(int i=1;i<=n;i++){
cout<<dep[i]<<" ";
}
return 0;
}
树的权值深度
#include<bits/stdc++.h>
using namespace std;
long long x,y,s,n,z,head[1100000],ver[1100000],nxt[1100000],dep[2200000],tot,vis[1100000],quan[1100000];
void add(int x,int y,int z){
tot++;
ver[tot]=y;
quan[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dep[ver[i]]=dep[x]+quan[i];
dfs(ver[i]);
}
}
}
int main(){
cin>>n>>s;
memset(head,-1,sizeof head);
for(int i=1;i<=n-1;i++){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
vis[s]=0;
dfs(s);
for(int i=1;i<=n;i++){
cout<<dep[i]<<" ";
}
return 0;
}
二叉搜索树
#include<bits/stdc++.h>
using namespace std;
struct tree{
int data,l,r,size;
}a[110000];
int tot,n,x;
char c;
void insert(int root,int k){
if(a[root].data==0){
tot++;
a[tot].data=k;
a[tot].size=1;
return ;
}
if(a[root].data<k&&a[root].r==0){//右空
tot++;
a[tot].data=k;
a[tot].size=1;//叶子节点
a[root].r=tot;
a[root].size++;
return ;
}
if(a[root].data>k&&a[root].l==0){//左空
tot++;
a[tot].data=k;
a[tot].size=1;//叶子节点
a[root].l=tot;
a[root].size++;
return ;
}
if(a[root].data<k){
insert(a[root].r,k);
}
else if(a[root].data>k){
insert(a[root].l,k);
}
a[root].size=a[a[root].l].size+a[a[root].r].size+1;//重新求当前节点的size
}
int query(int root,int k){
if(a[root].size==0){
return 0;
}
if(a[root].data<k){
return a[a[root].l].size+ 1 +query(a[root].r,k);
}
else if(a[root].data==k){
return a[a[root].l].size;
}
else{
return query(a[root].l,k);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>c>>x;
if(c=='i'){
insert(1,x);
}
if(c=='q'){
cout<<query(1,x)<<"\n";
}
}
return 0;
}
思考题
#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int main(){
int n,a;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
q.push(a);
}
long long sum=0;
while(q.size()>1){
int x=q.top();
q.pop();
int y=q.top();
q.pop();
sum+=x+y;
q.push(x+y);
}
cout<<sum;
return 0;
}
优先队列
#include<bits/stdc++.h>
using namespace std;
priority_queue<int>q;
int n,l,p;
struct node{
int fule;
int dist;
}s[11000];
bool cmp(node a,node b){
return a.dist>b.dist;
}
int main(){
cin>>n>>l>>p;
for(int i=0;i<n;i++){
cin>>s[i].dist;
}
for(int i=0;i<n;i++){
cin>>s[i].fule;
}
sort(s,s+n,cmp);
s[n].dist=0;
for(int i=0;i<=n;i++){
s[i].dist=l-s[i].dist;
}
int fules=p,ans=0,pos=0,d;
for(int i=0;i<=n;i++){
d=s[i].dist-pos;
while(fules<d){
if(q.empty()){
cout<<-1;
return 0;
}
fules+=q.top();
q.pop();
ans++;
}
fules-=d;
pos=s[i].dist;
q.push(s[i].fule);
}
cout<<ans;
return 0;
}
迷宫问题
#include<bits/stdc++.h>
using namespace std;
int vis[15][15],dx[]={0,-1,-1,-1,0,0,1,1,1},dy[]={0,-1,0,1,-1,1,-1,0,1},sum;
int a[15][15];
int n;
void dfs(int x,int y){
if(x==1&&y==n){
sum++;
return ;
}
vis[x][y]=1;
for(int i=1;i<=8;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=n){
if(vis[nx][ny]==0&&a[nx][ny]!=1){
dfs(nx,ny);
}
}
}
vis[x][y]=0;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
dfs(1,1);
cout<<sum;
return 0;
}
瓷砖
#include<bits/stdc++.h>
using namespace std;
char a[55][55];
int vis[55][55],n,m,cnt=1,b[55][55];
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1};
void dfs(int x,int y){
vis[x][y]=1;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
if(vis[nx][ny]==0&&b[nx][ny]==0){
dfs(nx,ny);
cnt++;
}
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='.'){
b[i][j]=0;
}
else if(a[i][j]=='#'){
b[i][j]=1;
}
else if(a[i][j]=='@'){
b[i][j]=2;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(b[i][j]==2){
dfs(i,j);
}
}
}
cout<<cnt;
return 0;
}
最大黑区域
#include<bits/stdc++.h>
using namespace std;
int vis[105][105],a[105][105],n,m,maxx;
int dx[]={0,-1,1,0,0},dy[]={0,0,0,1,-1};
int cnt;
void dfs(int x,int y){
cnt++;
vis[x][y]=1;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
if(vis[nx][ny]==0&&a[nx][ny]==1){
dfs(nx,ny);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cnt=0;
if(vis[i][j]==0&&a[i][j]==1){
dfs(i,j);
maxx=max(maxx,cnt);
}
}
}
cout<<maxx;
return 0;
}
图的遍历——深度优先搜索
#include<bits/stdc++.h>
using namespace std;
int a[105][105],n,vis[1005];
void dfs(int x){
vis[x]=1;
cout<<x-1<<" ";
for(int i=1;i<=n;i++){
if(vis[i]==0&&a[x][i]!=0){
dfs(i);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
dfs(i);
}
}
return 0;
}
猴群
#include<bits/stdc++.h>
using namespace std;
int vis[105][105],dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1},sum;
char a[105][105];
int b[105][105];
int n,m;
void dfs(int x,int y){
vis[x][y]=sum;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
if(vis[nx][ny]==0&&b[nx][ny]!=0){
dfs(nx,ny);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
b[i][j]=a[i][j]-'0';
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]==0&&b[i][j]!=0){
sum++;
dfs(i,j);
}
}
}
cout<<sum;
return 0;
}
全排列
#include<bits/stdc++.h>
using namespace std;
char ans[110],a[10];
int vis[100];
int len;
void dfs(int x){
if(x==len){
for(int i=0;i<len;i++){
cout<<ans[i];
}
cout<<endl;
return ;
}
for(int i=0;i<len;i++){
if(vis[i]==0){
ans[x]=a[i];
vis[i]=1;
dfs(x+1);
vis[i]=0;
}
}
}
int main() {
cin>>a;
len=strlen(a);
dfs(0);
return 0;
}
全排列问题
#include<bits/stdc++.h>
using namespace std;
int n,vis[110],ans[110];
void dfs(int x) { //搜位置
if(x==n+1) {//前n个位置都搜好了
for(int i=1; i<=n; i++) {
cout<<setw(5)<<ans[i];
}
cout<<endl;
return ;
}
for(int i=1; i<=n; i++) {
if(vis[i]==0) {
ans[x]=i;//x位置选i
vis[i]=1;
dfs(x+1);//下一个位置
vis[i]=0;
}
}
}
int main() {
cin>>n;
dfs(1);
return 0;
}
素数圆环
#include<bits/stdc++.h>
using namespace std;
int n,ans[110],vis[110];
int p(int n){
for(int i=2;i<=n-1;i++){
if(n%i==0){
return 0;
}
}
return 1;
}
void dfs(int w){
if(w==n+1){
for(int i=1;i<=n;i++){
cout<<ans[i]<<" ";
}
cout<<endl;
}
for(int i=2;i<=n;i++){
if(w==n&&vis[i]==0&&p(i+1)&&p(i+ans[w-1])){
ans[w]=i;
vis[i]=1;
dfs(w+1);
vis[i]=0;
}
else if(w!=n&&vis[i]==0&&p(i+ans[w-1])){
ans[w]=i;
vis[i]=1;
dfs(w+1);
vis[i]=0;
}
}
}
int main() {
int sum=0;
while(cin>>n){
ans[1]=1;
sum++;
cout<<"Case "<<sum<<":"<<endl;
if(n!=1){
dfs(2);
}
cout<<endl;
}
return 0;
}
小猫爬山
#include<bits/stdc++.h>
using namespace std;
int m,k;
int a[20],w[20];
int ans;
void dfs(int n,int g){//第n只小猫,有g个组
if(g>=ans){//组数多
return ;
}
if(n==m+1){
ans=g;
return ;
}
for(int i=1;i<=g;i++){
if(w[i]+a[n]<=k){
w[i]+=a[n];
dfs(n+1,g);
w[i]-=a[n];
}
}
w[g+1]=a[n];
dfs(n+1,g+1);
w[g+1]=0;
}
int main() {
cin>>m>>k;
ans=m;//最少组数初始化,为猫的数量
for(int i=1;i<=m;i++){
cin>>a[i];
}
sort(a+1,a+m+1);
reverse(a+1,a+m+1);
dfs(1,0);
cout<<ans;
return 0;
}
01背包问题
#include<bits/stdc++.h>
using namespace std;
int maxx,m,n;
struct s{
int wi,ci;
}a[220];
void dfs(int x,int sumw,int sumv){
if(x==n+1){
if(sumw<=m){
maxx=max(maxx,sumv);
}
return ;
}
dfs(x+1,sumw,sumv);
dfs(x+1,sumw+a[x].wi,sumv+a[x].ci);
}
int main() {
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i].wi>>a[i].ci;
}
dfs(1,0,0);
cout<<maxx;
return 0;
}
分成互质组
#include<bits/stdc++.h>
using namespace std;
long long vis[20];
int a[20],n;
int minn=15;
int gcd(int a,int b){//求最大公因数(递归法)
if(a%b==0){
return b;
}
else return gcd(b,a%b);
}
void dfs(int k,int s){
if(s==n+1){//n个数都放完了
if(k<minn){
minn=k;//求最小值
}
return ;//无条件返回
}
for(int i=1;i<=k;i++){
if(gcd(a[s],vis[i])==1){//如果当前数字和互质组内已有数字的最大公约数是1,则说明互质
vis[i]*=a[s];
dfs(k,s+1);
vis[i]/=a[s];//回溯的话需要把当前数字从刚才的互质组再取出来
}
}
vis[k+1]*=a[s];//最后一种可能收数字单独新开一个互质组
dfs(k+1,s+1);//互质组数量多了一个,给下一个数字搜索互质
vis[k+1]/=a[s];//回溯
}
int main() {
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=10;i++){//vis数组赋值(n的最大值)
vis[i]=1;
}
dfs(1,1);
cout<<minn;
return 0;
}
骑士遍历初级版(小数据)
#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,1,2,2,1},dy[5]={0,-2,-1,1,2};
int n,m,rode[110];
int flag=0;
void dfs(int x,int y,int k){
if(flag==1){
return ;
}
if(x==n&&y==m){
flag=1;
for(int i=0;i<k;i++){
cout<<rode[i]<<" ";
}
return ;
}
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
rode[k]=i;
dfs(nx,ny,k+1);
}
}
}
int main(){
cin>>n>>m;
dfs(1,1,0);
if(flag==0){
cout<<"-1";
}
return 0;
}
N皇后
#include<bits/stdc++.h>
using namespace std;
int zs[30],ys[30],sum,c[30],ans[30],n;
void dfs(int x){
if(x==n+1){
sum++;
if(sum<=3){
for(int j=1;j<=n;j++){
cout<<ans[j]<<" ";
}
cout<<endl;
}
return ;
}
for(int i=1;i<=n;i++){
if(c[i]==0&&zs[x-i+n]==0&&ys[x+i]==0){
ans[x]=i;//存答案列
c[i]=1;
zs[x-i+n]=1;
ys[x+i]=1;
dfs(x+1);
c[i]=0;
zs[x-i+n]=0;
ys[x+i]=0;
}
}
}
int main() {
cin>>n;
dfs(1);
cout<<sum;
return 0;
}
八皇后问题
#include<bits/stdc++.h>
using namespace std;
int a[10][10],sum;
bool c(int x,int y){
for(int i=1;i<x;i++){
if(a[i][y]==1){
return 0;
}
}
for(int i=x-1,j=y-1;i>=1&&j>=1;i--,j--){
if(a[i][j]==1){
return 0;
}
}
for(int i=x-1,j=y+1;i>=1&&j<=8;i--,j++){
if(a[i][j]==1){
return 0;
}
}
return 1;
}
void dfs(int x){
if(x==9){
sum++;
cout<<"No. "<<sum<<endl;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return ;
}
else{
for(int i=1;i<=8;i++){//x行放i列
if(c(x,i)){
a[x][i]=1;
dfs(x+1);
a[x][i]=0;
}
}
}
}
int main() {
dfs(1);//从第一行开始
return 0;
}
棋盘问题
#include<bits/stdc++.h>
using namespace std;
int sum,c[30],ans[30],n,m,d;
char s[30][30];
void dfs(int x,int d){
if(m<d){
sum++;
return ;
}
if(x>n){
return ;
}
for(int i=1;i<=n;i++){
if(s[x][i]=='#'&&c[i]==0){
c[i]=1;
dfs(x+1,d+1);
c[i]=0;
}
}
dfs(x+1,d);
}
int main() {
while(cin>>n>>m){
if(n==-1&&m==-1){
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>s[i][j];
}
}
sum=0;
dfs(1,1);
cout<<sum<<endl;
}
return 0;
}
骑士遍历初级版
#include<bits/stdc++.h>
using namespace std;
int dx[5]={0,1,2,2,1},dy[5]={0,-2,-1,1,2};
int n,m,rode[110];
int flag=0;
void dfs(int x,int y,int k){
if(flag==1){
return ;
}
if((m-y)>2*(n-x)){
return ;
}
if(x==n&&y==m){
flag=1;
for(int i=0;i<k;i++){
cout<<rode[i]<<" ";
}
return ;
}
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
rode[k]=i;
dfs(nx,ny,k+1);
}
}
}
int main(){
cin>>n>>m;
dfs(1,1,0);
if(flag==0){
cout<<"-1";
}
return 0;
}
走迷宫
#include<bits/stdc++.h>
using namespace std;
char a[50][50];
int r,c,step[105][105],vis[105][105],dy[5]={0,0,0,1,-1},dx[5]={0,1,-1,0,0};
queue<int>qx,qy;
void bfs(int stx,int sty){
qx.push(stx);
qy.push(sty);
vis[stx][sty]=1;
step[stx][sty]=1;
//遍历队列
while(qx.empty()==0){
int x=qx.front();//取队头
int y=qy.front();
qx.pop();//出队
qy.pop();
for(int i=1;i<=4;i++){//发散
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=r&&ny>=1&&ny<=c){
if(a[nx][ny]=='.'&&vis[nx][ny]==0){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[x][y]+1;
}
}
}
}
}
int main(){
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>a[i][j];
}
}
bfs(1,1);
cout<<step[r][c]<<" ";
return 0;
}
关系网络
1.深搜
#include<bits/stdc++.h>
using namespace std;
int a[110][110],c[11000],x,y,n,sum,ans=10000;
void dfs(int m,int u){
if(m==y){
ans=min(ans,u);
return ;
}
c[m]=1;
for(int i=1;i<=n;i++){
if(a[m][i]==1&&c[i]==0){
dfs(i,u+1);
}
}
c[m]=0;
}
int main(){
cin>>n>>x>>y;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
dfs(x,1);
cout<<ans-2;
return 0;
}
2.广搜
#include<bits/stdc++.h>
using namespace std;
int step[1100],vis[1100],n,x,y;
int a[110][110];
queue<int>q;
void bfs(int x) {
q.push(x);
vis[x]=1;
step[x]=1;
while(q.empty()==0) {
int s=q.front();
q.pop();
for(int i=1; i<=n; i++) {
if(a[s][i]==1&&vis[i]==0) {
q.push(i);
vis[i]=1;
step[i]=step[s]+1;
}
}
}
}
int main() {
cin>>n>>x>>y;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
}
}
bfs(x);
cout<<step[y]-2;
return 0;
}
图的遍历——广度优先搜索
#include<bits/stdc++.h>
using namespace std;
int step[1100],vis[1100],n,x,y;
int a[110][110];
queue<int>q;
void bfs(int x) {
q.push(x);
vis[x]=1;
step[x]=1;
while(q.empty()==0) {
int s=q.front();
cout<<s-1<<" ";
q.pop();
for(int i=1; i<=n; i++) {
if(a[s][i]==1&&vis[i]==0) {
q.push(i);
vis[i]=1;
step[i]=step[s]+1;
}
}
}
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
}
}
bfs(1);
return 0;
}
小可走迷宫
#include<bits/stdc++.h>
using namespace std;
char a[1100][1100];
int t,n,m,step[1150][1150],vis[1150][1150],dy[5]={0,0,0,1,-1},dx[5]={0,1,-1,0,0};
struct node{
int x,y;
};
queue<node>q;
void bfs(int x,int y){
q.push({x,y});
vis[x][y]=1;
step[x][y]=1;
while(q.empty()==0){
node t=q.front();
if(a[t.x][t.y]=='E'){
cout<<step[t.x][t.y]-1<<endl;
return ;
}
q.pop();
for(int i=1;i<=4;i++){
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){
if(a[nx][ny]!='#'&&vis[nx][ny]==0){
q.push({nx,ny});
vis[nx][ny]=1;
step[nx][ny]=step[t.x][t.y]+1;
}
}
}
}
cout<<"-1"<<endl;
}
int main(){
cin>>t;
for(int i=1;i<=t;i++){
int fi,fj;
while(q.empty()==0){
q.pop();
}
memset(vis,0,sizeof vis);
memset(step,0,sizeof step);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
fi=i;
fj=j;
}
}
}
bfs(fi,fj);
}
return 0;
}
矩阵距离
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,0,-1,1},
dy[]={0,-1,1,0,0};
char a[1100][1100];
int n,m,step[1100][1100],vis[1100][1100];
queue<int>qx,qy;
void bfs(){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='1'){
qx.push(i);
qy.push(j);
vis[i][j]=1;
step[i][j]=1;
}
}
}
while(qx.empty()==0&&qy.empty()==0){
int fqx=qx.front();
int fqy=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=4;i++){
int nx=fqx+dx[i];
int ny=fqy+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
if(vis[nx][ny]==0){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[fqx][fqy]+1;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
bfs();
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%d ",step[i][j]-1);
}
printf("\n");
}
return 0;
}
最少步数
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,-2,-2,-1,1,2,2,2,2,1,-1,-2,-2},
dy[]={0,1,2,2,2,2,1,-1,-2,-2,-2,-2,-1};
int a[110][110],ax,ay,bx,by,step[110][110],vis[110][110];
queue<int>qx,qy;
void bfs(int x,int y){
qx.push(x);
qy.push(y);
vis[x][y]=1;
step[x][y]=1;
while(qx.empty()==0&&qy.empty()==0){
int fx=qx.front();
int fy=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=12;i++){
int nx=fx+dx[i];
int ny=fy+dy[i];
if(nx<=100&&nx>=1&&ny<=100&&ny>=1){
if(vis[nx][ny]==0){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[fx][fy]+1;
}
}
}
}
}
int main(){
cin>>ax>>ay>>bx>>by;
bfs(1,1);
cout<<step[ax][ay]-1<<endl<<step[bx][by]-1;
return 0;
}
Labyrinth
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,sx,sy;
};
int vis[2005][2005],step[2005][2005];
int dy[]={0,0,-1,1},
dx[]={-1,1,0,0};
int n,m,r,c,sx,sy,cnt=0;
char a[12005][2005];
deque<node>q;
void bfs(int x,int y,int ssx,int ssy){
q.push_front({x,y,ssx,ssy});
vis[x][y]=1;
step[x][y]=0;
while(q.empty()==0){
node t=q.front();
q.pop_front();
cnt++;
for(int i=0;i<4;i++){
int nx=t.x+dx[i];
int ny=t.y+dy[i];
if(nx>=1&&nx<=n&&ny<=m&&ny>=1&&vis[nx][ny]==0&&a[nx][ny]!='*'){
if(i==2&&t.sx>0){
q.push_back({nx,ny,t.sx-1,t.sy});
vis[nx][ny]=1;
vis[nx][ny]=step[t.x][t.y]+1;
}
else if(i==3&&t.sy>0){
q.push_back({nx,ny,t.sx,t.sy-1});
vis[nx][ny]=1;
vis[nx][ny]=step[t.x][t.y]+1;
}
else if(i==0||i==1){
q.push_front({nx,ny,t.sx,t.sy});
vis[nx][ny]=1;
vis[nx][ny]=step[t.x][t.y]+1;
}
}
}
}
}
int main(){
cin>>n>>m>>r>>c>>sx>>sy;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
bfs(r,c,sx,sy);
cout<<cnt;
return 0;
}
最小DFS序
#include<bits/stdc++.h>
using namespace std;
int a[1100][1100],vis[1100000];
int n,s,x,y;
void dfs(int x){
cout<<x<<" ";
vis[x]=1;
for(int i=1;i<=n;i++){
if(vis[i]==0&&a[i][x]==1){
dfs(i);
}
}
cout<<x<<" ";
}
int main(){
cin>>n>>s;
for(int i=1;i<=n-1;i++){
cin>>x>>y;
a[x][y]=1;
a[y][x]=1;
}
dfs(s);
return 0;
}
树的重心1
#include<bits/stdc++.h>
using namespace std;
int ver[220000],nxt[220000],head[220000],tot,vis[220000],size[110000],zx,minn=110000,n,s,x,y;
void add(int x,int y){
tot++;
ver[tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
size[x]=1;
int maxx=0;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dfs(ver[i]);
size[x]+=size[ver[i]];
maxx=max(maxx,size[ver[i]]);
}
}
maxx=max(maxx,n-size[x]);
if(maxx<minn){
minn=maxx;
zx=x;
}
}
int main(){
cin>>n>>s;
memset(head,-1,sizeof head);
for(int i=1;i<=n-1;i++){
cin>>x>>y;
add(x,y);
add(y,x);
}
dfs(s);
cout<<zx<<" "<<minn;
return 0;
}
树的直径1
#include<bits/stdc++.h>
using namespace std;
int n,a,b,c,ver[22000],head[22000],nxt[22000],dep[11000],vis[22000],q[22000],tot,maxx,t;
void add(int x,int y,int z){
tot++;
ver[tot]=y;
q[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
dep[ver[i]]=dep[x]+q[i];
if(maxx<dep[ver[i]]){
maxx=dep[ver[i]];
t=ver[i];
}
dfs(ver[i]);
}
}
}
int main(){
cin>>n;
int m=0;
memset(head,-1,sizeof head);
for(int i=1;i<=n-1;i++){
cin>>a>>b>>c;
add(a,b,c);
add(b,a,c);
}
dfs(1);
memset(dep,0,sizeof dep);
memset(vis,0,sizeof vis);
dfs(t);
for(int i=1;i<=n;i++){
if(maxx<i){
maxx=i;
}
}
cout<<maxx;
return 0;
}
蚂蚁移动问题
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,1},dy[]={0,1,0},vis[300][300],d[400][3],sum;
int n,m;
void dfs1(int x,int y){
vis[x][y]=1;
if(x==n&&y==m){
sum++;
return ;
}
for(int i=1;i<=2;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
if(vis[nx][ny]==0){
vis[nx][ny]=1;
dfs1(nx,ny);
vis[nx][ny]=0;
}
}
}
vis[x][y]=0;
}
void dfs2(int x,int y,int k){
vis[x][y]=1;
d[k][1]=x;
d[k][2]=y;
if(x==n&&y==m){
sum++;
cout<<"路线"<<sum<<":";
for(int i=1;i<=k-1;i++){
cout<<"("<<d[i][1]<<","<<d[i][2]<<")"<<" - ";
}
cout<<"("<<d[k][1]<<","<<d[k][2]<<")";
cout<<endl;
return ;
}
for(int i=1;i<=2;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
if(vis[nx][ny]==0){
vis[nx][ny]=1;
dfs2(nx,ny,k+1);
vis[nx][ny]=0;
}
}
}
}
int main(){
cin>>n>>m;
dfs1(1,1);
cout<<"蚂蚁共有"<<sum<<"种移动路线:"<<endl;
memset(vis,0,sizeof vis);
sum=0;
dfs2(1,1,1);
return 0;
}
走迷宫
#include<bits/stdc++.h>
using namespace std;
int dx[]= {0,0,-1,0,1},dy[]= {0,-1,0,1,0};
int n,m,qx,qy,zx,zy,a[20][20],vis[20][20],b[400][3],flag;
void dfs(int x,int y,int k) {
vis[x][y]=1;
b[k][1]=x;
b[k][2]=y;
if(x==zx&&y==zy) {
flag=1;
for(int i=1; i<=k-1; i++) {
cout<<"("<<b[i][1]<<","<<b[i][2]<<")"<<"->";
}
cout<<"("<<b[k][1]<<","<<b[k][2]<<")";
cout<<endl;
return ;
}
for(int i=1; i<=4; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1) {
if(vis[nx][ny]==0&&a[nx][ny]==1) {
vis[nx][ny]=1;
dfs(nx,ny,k+1);
vis[nx][ny]=0;
}
}
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>a[i][j];
}
}
cin>>qx>>qy;
cin>>zx>>zy;
dfs(qx,qy,1);
if(flag==0) {
cout<<"-1";
}
return 0;
}
山峰和山谷
#include<bits/stdc++.h>
using namespace std;
int cntsf,cntsg,vis[2200][2200],n,x,y,a[2200][2200],flag,flag1;
int dx[]= {0,-1,-1,-1,0,0,1,1,1},
dy[]= {0,-1,0,1,-1,1,-1,0,1};
void dfs(int x,int y) {
vis[x][y]=1;
for(int i=1; i<=8; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=n&&ny>=1) {
if(a[nx][ny]>a[x][y]) {
flag=1;
}
else if(a[nx][ny]<a[x][y]) {
flag1=1;
}
else if(vis[nx][ny]==0) {
dfs(nx,ny);
}
}
}
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>a[i][j];
}
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(vis[i][j]==0) {
dfs(i,j);
if(flag1==1&&flag==0) {
cntsf++;
} else if(flag==1&&flag1==0) {
cntsg++;
} else if(flag1==0&&flag==0) {
cntsf++;
cntsg++;
}
flag=0;
flag1=0;
}
}
}
cout<<cntsf<<" "<<cntsg;
return 0;
}
沼泽问题
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,1,-1,0,0},dy[]={0,0,0,-1,1},cnt;
char a[15][15];
int vis[15][15],n;
void dfs(int x,int y){
if(x==n&&y==n){
cnt++;
return ;
}
vis[x][y]=1;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=n&&ny>=1){
if(vis[nx][ny]==0&&a[nx][ny]=='0'){
vis[nx][ny]=1;
dfs(nx,ny);
vis[nx][ny]=0;
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
dfs(1,1);
cout<<cnt;
return 0;
}
和为k的组合
#include<bits/stdc++.h>
using namespace std;
int n,k,flag=0;
int a[50];
void dfs(int x,int sum){
if(x==n+1){
if(sum==k){
flag=1;
}
return ;
}
dfs(x+1,sum+a[x]);
dfs(x+1,sum);
}
int main(){
while(cin>>n>>k){
flag=0;
if(n==0&&k==0){
return 0;
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
dfs(1,0);
if(flag==0){
cout<<"No"<<endl;
}
else if(flag==1){
cout<<"Yes"<<endl;
}
}
return 0;
}
高逐位整除数
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+10;
int n,vis[50],a[N];
void dfs(int x) {
int sum=0;
if(x==n+1) {
for(int i=1; i<=n; i++) {
cout<<a[i];
}
cout<<endl;
return ;
}
if(x==1) {
for(int i=1; i<=9; i++) {
a[1]=i;
dfs(2);
}
}
else {
for(int i=1; i<=x-1; i++) {
sum=(sum*10+a[i])%x;
}
for(int i=0; i<=9; i++) {
if((sum*10+i)%x==0) {
a[x]=i;
dfs(x+1);
}
}
}
}
int main() {
while(cin>>n) {
dfs(1);
}
return 0;
}
图的m着色问题
#include<bits/stdc++.h>
using namespace std;
int n,k,m,u,v,a[2600][2600],vis[100000],sum;
void dfs(int x) {
if(x>n) {
sum++;
return ;
}
for(int i=1; i<=m; i++) {
int flag=0;
vis[x]=i;
for(int j=1; j<=n; j++) {
if(vis[j]==i&&a[x][j]==1) {
flag=1;
break;
}
}
if(flag==0) {
dfs(x+1);
}
vis[x]=0;
}
}
int main() {
cin>>n>>k>>m;
for(int i=1; i<=k; i++) {
cin>>u>>v;
a[u][v]=1;
a[v][u]=1;
}
dfs(1);
cout<<sum<<endl;
return 0;
}
最大人工岛
#include<bits/stdc++.h>
using namespace std;
int n,m,a[550][550],vis[550][550],step[2500];
int dx[]={0,0,0,-1,1},dy[]={0,1,-1,0,0},sum=0;
int cnt=0;
void dfs(int x,int y){
sum++;
vis[x][y]=cnt;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny<=m&&ny>=1){
if(a[nx][ny]==1&&vis[nx][ny]==0){
dfs(nx,ny);
}
}
}
}
int c(int x,int y){
int h=0;
map<int,int>g;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
if(a[nx][ny]==1&&vis[nx][ny]!=0){
int zu=vis[nx][ny];
if(g[zu]==0){
h+=step[zu];
g[zu]=1;
}
}
}
}
return h;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]==0&&a[i][j]==1){
cnt++;
dfs(i,j);
step[cnt]=sum;
sum=0;
}
}
}
int maxx=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]==0){
maxx=max(maxx,c(i,j)+1);
}
}
}
cout<<maxx;
return 0;
}
The Castle
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,-1,0,1},dy[]={0,-1,0,1,0},n,m,a[60][60],cnt,maxx=0,sum=0;
int vis[60][60];
void dfs(int x,int y){
sum++;
vis[x][y]=cnt;
int t=a[x][y];
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(t%2==0){
if(nx<=n&&nx>=1&&ny<=m&&ny>=1){
if(vis[nx][ny]==0){
dfs(nx,ny);
}
}
}
t/=2;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]==0){
cnt++;
dfs(i,j);
maxx=max(maxx,sum);
sum=0;
}
}
}
cout<<cnt<<endl<<maxx;
return 0;
}
仙岛求药
#include<bits/stdc++.h>
using namespace std;
int step[30][30][30],vis[30][30][30],l,r,c;//step[高][長][宽]
char a[30][30];
int dx[]={0,0,0,-1,1},dy[]={0,-1,1,0,0},qi,qj,qz,ei,ej,ez;
queue<int>qx,qy,qz;
void bfs(){
qx.push(qi);
qy.push(qj);
qz.push(qz);
vis[qi][qj][qz]=1;
step[qi][qj][qz]=1;
while(qx.empty()==0&&qy.empty()==0&&qz.empty){
int x=qx.front();
int y=qy.front();
int z=qz.front();
qx.pop();
qy.pop();
qz
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&ny<=m&&nx>=1&&ny>=1){
if(vis[nx][ny]==0&&a[nx][ny]!='#'){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[x][y]+1;
}
}
}
}
}
int main(){
while(cin>>l>>r>>c){
if(l==0&&r==0&&c==0){
return 0;
}
qi=0,qj=0,ei=0,ej=0;
while(qx.empty()==0){
qx.pop();
}
while(qy.empty()==0){
qy.pop();
}
memset(vis,0,sizeof vis);
memset(step,0,sizeof step);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='@'){
qi=i;
qj=j;
}
if(a[i][j]=='*'){
ei=i;
ej=j;
}
}
}
bfs();
cout<<step[ei][ej]-1<<endl;
}
return 0;
}
抓住那头牛
#include<bits/stdc++.h>
using namespace std;
int step[110000],vis[110000],n,k,sum=0,maxx=0;
int dx[5]={0,1,-1};
queue<int>q;
void bfs(int x){
q.push(x);
vis[x]=1;
step[x]=1;
while(q.empty()==0){
int s=q.front();
q.pop();
for(int i=1;i<=3;i++){
int nx=s+dx[i];
if(i==3){
nx=s*2;
}
if(nx<=100000&&nx>=0&&vis[nx]==0){
q.push(nx);
step[nx]=step[s]+1;
vis[nx]=1;
}
}
}
}
int main(){
cin>>n>>k;
bfs(n);
cout<<step[k]-1;
return 0;
}
武士风度的牛
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,-2,-2,-1,-1,1,1,2,2},
dy[]={0,-1,1,-2,2,-2,2,-1,1};
int step[160][160],vis[160][160],n,m,qi,qj,sum=0,ei,ej;
char a[160][160];
queue<int>qx,qy;
void bfs(){
qx.push(qi);
qy.push(qj);
vis[qi][qj]=1;
while(qx.empty()==0){
int sx=qx.front();
int sy=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=8;i++){
int nx=sx+dx[i];
int ny=sy+dy[i];
if(nx<=n&&ny<=m&&nx>=1&&ny>=1){
if(vis[nx][ny]==0&&a[nx][ny]!='*'){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[sx][sy]+1;
}
}
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='K'){
qi=i;
qj=j;
}
if(a[i][j]=='H'){
ei=i;
ej=j;
}
}
}
bfs();
cout<<step[ei][ej];
return 0;
}
献给阿尔吉侬的花束
#include<bits/stdc++.h>
using namespace std;
queue<long long>qx,qy;
int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
int t,r,c,step[210][210],vis[210][210],qi,qj,zi,zj,flag=0;
char a[210][210];
void bfs(){
qx.push(qi);
qy.push(qj);
vis[qi][qj]=1;
step[qi][qj]=1;
while(qx.empty()==0){
int x=qx.front();
int y=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx==r&&ny==c){
flag=1;
}
if(nx>=1&&ny>=1&&nx<=r&&ny<=c){
if(vis[nx][ny]==0&&a[nx][ny]!='#'){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[x][y]+1;
}
}
}
}
}
int main(){
cin>>t;
for(int k=1;k<=t;k++){
flag=0;
memset(vis,0,sizeof vis);
memset(step,0,sizeof step);
while(qx.empty()==0){
qx.pop();
}
while(qy.empty()==0){
qy.pop();
}
cin>>r>>c;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>a[i][j];
if(a[i][j]=='S'){
qi=i;
qj=j;
}
if(a[i][j]=='E'){
zi=i;
zj=j;
}
}
}
bfs();
if(flag==0){
cout<<"oop!"<<endl;
}
else if(flag==1){
cout<<step[zi][zj]-1<<endl;
}
}
return 0;
}
细胞
#include<bits/stdc++.h>
using namespace std;
int dx[]={0,0,0,-1,1},dy[]={0,-1,1,0,0};
int n,m,vis[120][120],cnt=0;
char a[120][120];
void dfs(int x,int y){
vis[x][y]=cnt;
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&ny<=m&&nx>=1&&ny>=1){
if(vis[nx][ny]==0&&a[nx][ny]!='0'){
dfs(nx,ny);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(vis[i][j]==0&&a[i][j]!='0'){
cnt++;
dfs(i,j);
}
}
}
cout<<cnt;
return 0;
}
树的权值深度
#include<bits/stdc++.h>
using namespace std;
int head[220000],ver[440000],nxt[440000],tot,quan[440000],d[440000];
int vis[440000];
int x,y,z,s,n;
void add(int x,int y,int z){
tot++;
ver[tot]=y;
quan[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
void dfs(int x){
vis[x]=1;
for(int i=head[x];i!=-1;i=nxt[i]){
if(vis[ver[i]]==0){
d[ver[i]]=d[x]+quan[i];
dfs(ver[i]);
}
}
}
int main(){
cin>>n>>s;
memset(head,-1,sizeof head);
for(int i=1;i<n;i++){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dfs(s);
ver[s]=0;
for(int i=1;i<=n;i++){
cout<<d[i]<<" ";
}
return 0;
}
营救
#include<bits/stdc++.h>
using namespace std;
int n,vis[1100][1100],qi,qj,zx,zy;
char a[1100][1100];
queue<long long>qx,qy;
int step[1100][1100];
int dx[]={0,0,0,1,-1},dy[]={0,1,-1,0,0};
void bfs(int sx,int sy){
qx.push(sx);
qy.push(sy);
vis[sx][sy]=1;
step[sx][sy]=1;
while(qx.empty()==0){
int x=qx.front();
int y=qy.front();
qx.pop();
qy.pop();
for(int i=1;i<=4;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<=n&&ny<=n&&nx>=1&&ny>=1){
if(vis[nx][ny]==0&&a[nx][ny]=='0'){
qx.push(nx);
qy.push(ny);
vis[nx][ny]=1;
step[nx][ny]=step[x][y]+1;
}
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
cin>>qi>>qj>>zx>>zy;
bfs(qi,qj);
cout<<step[zx][zy]-1;
return 0;
}