题目:
http://codevs.cn/problem/1002/
终于调出来了;
一下午了
WA的原因:本应是if,写成了else if;
导致我一直以为没考虑全所有情况于是……我把所有情况列举出来了……266行……
思路:
dfs找联通块,然后建图跑kruskal;
难点在建图,找全所有情况!!!!
总结:
1.注意排面,多写几个函数可以省去许多功夫……
2.切记if不要写成else if!!!!!!!!!!!!!!
又长又丑的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=201;
char ma[MAXN][MAXN];
int n,m,tot,cnt,num,ccans;
int vis[MAXN][MAXN],fa[100001];
int X[]={0,1,0,-1,0,1,1,-1,-1};
int Y[]={0,0,-1,0,1,1,-1,-1,1};
bool gra[MAXN][MAXN][MAXN];
struct hh
{
int from,to,cost;
}mp[100001];
void init()
{
memset(vis,0,sizeof(vis));
return;
}
bool can(int x,int y)
{
if(x<1 || x>n || y<1 || y>m ) return false;
return true;
}
bool cmp(hh a,hh b)
{
return a.cost < b.cost;
}
void build(int f,int t,int c)
{
mp[++cnt]=(hh){f,t,c};
return;
}
void dfs(int x,int y,int d) //找联通块;
{
for(int i=1;i<=8;i++)
{
int fx=x+X[i],fy=y+Y[i];
if(can(fx,fy) && ma[fx][fy]=='#' && !vis[fx][fy])
vis[fx][fy]=d,dfs(fx,fy,d);
}
return;
}
//----------------------------------------------------------- kruskal
int find(int x)
{
int r=x,t;
while(r!=fa[r]) r=fa[r];
// while(x!=r) t=fa[x],fa[x]=r,x=t;
return r;
}
void kruskal()
{
for(int i=1;i<=tot+100;i++) fa[i]=i;
sort(mp+1,mp+cnt+1,cmp);
for(int i=1;i<=cnt;i++)
{
int x=mp[i].from,y=mp[i].to;
int fx=find(x),fy=find(y);
if(fx!=fy)
fa[fx]=fy,num++,ccans+=mp[i].cost;
}
return;
}
//--------------------------------------------------------------
void build_gra()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(ma[i][j]=='#')
{
int x=i,y=j;
int fx=x,fy=y,step=0;
while(can(fx+1,fy))
{
fx++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fx=x,fy=y,step=0;
while(can(fx-1,fy))
{
fx--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fx=x,fy=y,step=0;
while(can(fx,fy+1))
{
fy++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fx=x,fy=y,step=0;
while(can(fx,fy-1))
{
fy--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
if(x-1>=1)
{
fx=x-1,fy=y,step=0;
while(can(fx,fy+1))
{
fy++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fx=x-1,fy=y,step=0;
while(can(fx,fy-1))
{
fy--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
}
if(x+1<=n)
{
fx=x+1,fy=y,step=0;
while(can(fx,fy+1))
{
fy++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fx=x+1,fy=y,step=0;
while(can(fx,fy-1))
{
fy--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
}
if(y+1<=m)
{
fy=y+1,fx=x,step=0;
while(can(fx+1,fy))
{
fx++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fy=y+1,fx=x,step=0;
while(can(fx-1,fy))
{
fx--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
}
if(y-1>=1)
{
fy=y-1,fx=x,step=0;
while(can(fx-1,fy))
{
fx--;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
fy=y-1,fx=x,step=0;
while(can(fx+1,fy))
{
fx++;
if(vis[fx][fy]==vis[x][y]) break;
else if(!vis[fx][fy]) step++;
else if(ma[fx][fy]=='#' && !gra[vis[fx][fy]][vis[x][y]][step])
build(vis[fx][fy],vis[x][y],step),
gra[vis[fx][fy]][vis[x][y]][step]=gra[vis[x][y]][vis[fx][fy]][step]=1;
}
}
}
}
return;
}
void solve()
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",ma[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(ma[i][j]=='#' && !vis[i][j])
tot++,vis[i][j]=tot,dfs(i,j,tot);
if(tot==1)
{
cout<<1<<'\n'<<0<<" "<<0<<'\n';
return;
}
build_gra();
// for(int i=1;i<=n;i++)
// {
// for(int j=1;j<=m;j++) cout<<vis[i][j]<<" ";
// cout<<endl;
// }
// for(int i=1;i<=cnt;i++) cout<<mp[i].from<<" "<<mp[i].to<<" "<<mp[i].cost<<endl;
// cout<<cnt<<"()()("<<endl;
kruskal();
cout<<tot<<"\n";
cout<<num<<" "<<ccans;
return;
}
int main()
{
solve();
return 0;
}