T2
题目描述:
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 505
#define M 250005
#define long long LL
int n,m,cnt=1,maxx,temp;
int g[N][N];
int vis[N][N];//有可能填海造陆,所以千万不要用bool
int flag[M];
int num[N];
int dx[]={6,-1,1,0,0};
int dy[]={6,0,0,-1,1};
void dfs(int x,int y){
vis[x][y]=cnt;
temp++;
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(g[nx][ny]==1&&vis[nx][ny]==0){//没有被标记
dfs(nx,ny);
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&g[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j]==1&&vis[i][j]==0){
temp=0;
dfs(i,j);
num[cnt]=temp;
cnt++;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(g[i][j]==0){
int sum=1;
memset(flag,0,sizeof(flag));
for(int q=1;q<=4;q++){
int nx=i+dx[q];
int ny=j+dy[q];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m){//越界检查
if(g[nx][ny]==1&&flag[vis[nx][ny]]==0){//没有被标记
sum+=num[vis[nx][ny]];
flag[vis[nx][ny]]++;
}
}
}
maxx=max(sum,maxx);
}
}
}
printf("%d",maxx);
return 0;
}
一道dfs的 (又难又麻烦) 的题
T3
题目描述:
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define N 3000
int num[N];
int n,m,flag,sum;
void dfs(int x,int y){
if(x==m||sum-x==m){
flag=1;
return ;
}
if(flag||y>=n) return ;
dfs(x+num[y],y+1);
dfs(x,y+1);
}
int main(){
while(scanf("%d%d",&n,&m)){
if(n==0&&m==0) break;
sum=0;
flag=0;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
sum+=num[i];
}
dfs(0,0);
if(flag)
printf("Yes\n");
else printf("No\n");
}
return 0;
}