代码优化
#include<bits/stdc++.h>
using namespace std;//area面积搜索
int sum=0,a[17][17];
void dfs(int x,int y) {//搜索函数
if(x>11||y>11||x<0||y<0) {//m1 判界 函数体前 简化
return;
}
if(a[x][y]) {//m2 判定轨迹 简化
return;
}
sum++;
a[x][y]=2;
dfs(x+1,y);
dfs(x,y+1);
dfs(x-1,y);
dfs(x,y-1);//m3 独立
return;
}
int main() {
for(int i=1; i<=10; i++) {
for(int j=1; j<=10; j++) {
scanf("%d",&a[i][j]);
if(a[i][j]==1) {
sum++;
}
}
}
dfs(0,0);
printf("%d",144-sum);//m4 (10+2)^2
return 0;
}
#include<bits/stdc++.h>
using namespace std;//奇怪电梯
int Q[201],m[201];
int n,a,b;
int main() {
scanf("%d%d%d",&n,&a,&b);
for(int i=1; i<=n; i++) {
scanf("%d",&m[i]);
Q[i]=-1;
}
Q[a]=0;
int l=1,st=0,j;
while(l>0&&Q[b]==-1) {
l=0;//m3 判定连续
for(int i=1; i<=n; i++) {
if(Q[i]==st) {//搜索队首
j=i+m[i];//m2 独立
if(j<=n&&Q[j]==-1) {//m1 判定轨迹 优化
Q[j]=st+1;
l=1;
}
j=i-m[i];
if(j>0&&Q[j]==-1) {
Q[j]=st+1;//入队
l=1;
}
}
}
st++;//出队
}
printf("%d\n",Q[b]);
return 0;
}
#include<bits/stdc++.h>
using namespace std;//产生数
char n[7];
int a[37],c[17],k;
bool t[17],b[17][17];
void dfs(int i,int j) {
t[i]=1;
c[j]++;
for(int m1=0; m1<10; m1++) {
if(b[i][m1]&&!t[m1]) {//m2 避免重复
dfs(m1,j);
}
}
}
int main() {
cin>>n>>k;
int len=strlen(n);
for(int i=0; i<len; i++) {
a[i]=n[i]-'0';//m1 位数分离
}
for(int i=0; i<k; i++) {
int x,y;
scanf("%d%d",&x,&y);
b[x][y]=1;
}
for(int i=0; i<10; i++) {
memset(t,0,sizeof(t));
dfs(i,i);
}
int sum=1;
for(int i=0; i<len; i++) {
sum*=c[a[i]];//m3 可能性相乘
}
printf("%d",sum);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a[100007];//家庭问题
int st(int x) {
if(a[x]!=x) {
a[x]=st(a[x]);
}//归
return a[x];
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
a[i]=i;
}
for(int i=1; i<=m; i++) {
int x,y;
scanf("%d %d",&x,&y);
a[x]=st(x);
a[y]=st(y);
a[a[y]]=a[x];//m1 归
}
int s=0,max1=0;
for(int i=1; i<=n; i++) {
int s2=0;
if(st(i)==i) {
s++;
}
for(int j=1; j<=n; j++) {
if(st(i)==st(j)) {
s2++;
}
}
max1=max(max1,s2);
}
printf("%d %d",s,max1);
}
解锁新错误
超出内存
空间复杂度高
队列空间时间复杂度低