CF359A
题面大概是说,给你一个矩阵。矩阵中有一些特殊点,用1表示。你可以从某个一点出发任选一个点把两者之间的矩阵染色,问最多需要染色几次。保证四个角不会是1.
任选一点,为使染色的矩阵面积最大,我们只应该选四角。任选一个点,最多四次就可以将全图染色。如果有点在矩阵的四条边上我们可以两次完成染色。(不接受任何反驳,有兴趣的同志可以自己手推一下)
垃圾算法:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int N=110;
struct node{
int x,y;
}a[maxn];
int g[N][N];
int n,m,cnt=0;
int main(){
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&g[i][j]);
if(g[i][j]==1){
a[++cnt].x=i,a[cnt].y=j;
}
}
for(int i=1;i<=cnt;i++){
if(a[i].x==1||a[i].y==1||a[i].x==n||a[i].y==m){
printf("2\n");
return 0;
}
}
printf("4\n");
return 0;
}
优秀算法:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=10010;
const int N=110;
int n,m,cnt=0;
int main(){
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int x;
scanf("%d",&x);
if(x){
if(i==1||i==n||j==1||j==m){
printf("2\n");
return 0;
}
}
}
printf("4\n");
return 0;
}