海战

【题目描述】

在一个方形的盘上放置了固定数量和形状的船只,每只船却不能碰到其它的船。在这个题中,我们仅考虑船是方形的,所有的船只都是由图形组成的方形。编写程序求出该棋盘上放置的船只的总数。

【输入描述】

输入文件头一行由用空格隔开的两个整数R和C组成,1 <= R,C <= 1000,这两个数分别表示游戏棋盘的行数和列数。接下来的R行每行包含C个字符,每个字符可以为“#”,也为“.”,“#”表示船只的一部分,“.”表示水。

【输出描述】

输出一行解。如果船的位置放得正确(即棋盘上只存在相互之间不能接触的方形,如果两个“#”号上下相邻或左右相邻却分属两艘不同的船只,则称这两艘船相互接触了)。就输出一段话“There are S ships.”,S表示船只的数量。否则输出“Bad placement.”。

【样例输入】

6 8

.....#.#

##.....#

##.....#

.......#

#......#

#..#...#

【样例输出】

There are 5 ships.

源代码:#include
using namespace std;
int x[3]={1,-1,0},y[3]={0,0,1}; //偷懒,人呐,总得多动点脑子,注意搜索顺序!
bool Flag[1001][1001]={0};
char Map[1001][1001];
int n,m,D,R,ans,sum;
void Right(int X,int Y) //右扩。
{R++;if (Map[X+1][Y]=='#')Right(X+1,Y); 
}
void Down(int X,int Y) //下扩。
{D++;if (Map[X][Y+1]=='#')Down(X,Y+1);
}
void Search(int X,int Y) //查找连接在一起的合法格子。
{sum++;Flag[X][Y]=true;for (int a=0;a<3;a++){int t1,t2;t1=X+x[a];t2=Y+y[a];if (!Flag[t1][t2]&&t1>=1&&t1<=n&&t2>=1&&t2<=m&&Map[t1][t2]=='#')Search(t1,t2);}
}
int main() //搜索要灵活。
{cin>>n>>m;for (int a=1;a<=n;a++)for (int b=1;b<=m;b++)cin>>Map[a][b]; //回车竟然是两个字符啊啊啊啊啊!for (int a=1;a<=n;a++)for (int b=1;b<=m;b++)if (!Flag[a][b]&&Map[a][b]=='#'){ans++;sum=D=R=0;Right(a,b);Down(a,b);Search(a,b);if (sum!=D*R) //是否为矩形。
             {cout<<"Bad placement.";return 0;}}cout<<"There are "<" ships.";return 0;
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部