http://poj.org/problem?id=1856
题目大意:合法船只的定义:由#构成的矩形,被一圈“.”所围成的船就是合法船只。如果有不合法的船只输出Bad placement.,否则输出合法船只的个数。
队内赛题,当时题没有读懂还是别人告诉我的,亏数据太水不然比赛时就爆0了。
附上复杂代码:找矩形,然后在判断是否满足条件(比赛时还是不要太紧张为好,思维不求快,求精密)
/*****
6 6
.....#
##...#
##...#
..#..#
.....#
######
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
0 0
5 5
##...
..###
.....
##...
.....
5 5
##.##
..#..
..#..
#...#
....#
5 5
###..
####.
###..
.....
#....
Bad placement.
5 5
##..#
##..#
...#.
.....
##...
5 5
##.##
##.##
##...
...##
##...
Bad placement.
There are 5 ships.
******/
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m;
char S[1005][1005];
int G[1005][1005];
int B;
void dfs(int a,int b)
{
if(G[a-1][b]||G[a+1][b-1]||G[a+1][b+1]||G[a-1][b+1]||G[a-1][b-1])
B=0;
int q=0;
for(int r=b; r<m; r++)
{
if(S[a][r]!='#')
break;
if(G[a-1][r]||G[a+1][r-1]||G[a+1][r+1]||G[a-1][r+1]||G[a-1][r-1])
B=0;
if(G[a][r])
break;
q++;
//cout<<r<<"->"<<endl;
}
//cout<<a<<" "<<b<<endl;
//cout<<B<<"---"<<endl;
for(int r=a; r<n; r++)
{
int sum=0,t;
if(S[r][b]!='#')
break;
for( t=b; t<m; t++)
{
if(S[r][t]!='#')
break;
if(G[r][t])
{
B=0;
continue;
}
if(S[r][t]=='#')
{
G[r][t]=1;
sum++;
}
}
if(sum!=q)
B=0;
}
}
int main()
{
while(cin>>n>>m&&n!=0&&m!=0)
{
memset(G,0,sizeof(G));
cin.get();
for(int i=0; i<n; i++)
gets(S[i]);
int sum=0;
B=1;
for(int i=0; i<n; i++)
{
if(!B)
break;
for(int j=0; j<m; j++)
{
if(!B)
break;
if(!G[i][j]&&S[i][j]=='#')
{
sum++;
dfs(i,j);
}
}
}
if(B)
cout<<"There are "<<sum<<" ships."<<endl;
else
cout<<"Bad placement."<<endl;
}
return 0;
}
大神的神算法:http://blog.csdn.net/mengxiang000000/article/details/51493408
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 1010
int maxx,maxy,minx,miny;
using namespace std;
char map[N][N];
int r,c;
bool check(int x,int y)
{
if(x>=0&&x<r&&y>=0&&y<c&&map[x][y]=='#')
return true;
return false;
}
int dfs(int x,int y)
{
minx=min(minx,x);
maxx=max(maxx,x);
miny=min(miny,y);
maxy=max(maxy,y);
map[x][y]='.';
int rec=1;
for(int i=-1;i<=1;i++)
for(int j=-1;j<=1;j++)
{
if(check(i+x,j+y))
{
rec+=dfs(i+x,j+y);
}
}
return rec;
}
int main()
{
while(~scanf("%d%d",&r,&c))
{
if(r==0&&c==0) break;
for(int i=0;i<r;i++)
scanf("%s",map[i]);
int ans=0;
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
{
if(map[i][j]=='#')
{
maxx=minx=i;
maxy=miny=j;
int rec=dfs(i,j);
if(rec==(maxx-minx+1)*(maxy-miny+1))
ans++;
else
{
ans=-1;//只要有一艘坏船就是bad
i=r;
break;
}
}
}
if(ans==-1)
printf("Bad placement.\n");
else
printf("There are %d ships.\n",ans);
}
return 0;
}