24.12.20学习总结

题目描述

由数字 0组成的方阵中,有一任意形状的由数字 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2。例如:6×6 的方阵(n=6),涂色前和涂色后的方阵如下:

如果从某个 0出发,只向上下左右 4 个方向移动且仅经过其他 0 的情况下,无法到达方阵的边界,就认为这个 0 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内的 0 是连通的(两两之间可以相互到达)。

0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 1 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 1 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 n(1≤n≤30)。

接下来 n行,由 0 和 1 组成的 n×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 0。

输出格式

已经填好数字 2的完整方阵。

输入输出样例

输入 

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1

输出 

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

对于100% 的数据,1≤n≤30。

对了64%的代码:

#include<stdio.h>
int cat1(int a[30][30],int i,int j)//向上找
{
	int x=0;
	for(int k=i-1;k>=0;k--)
	{
		if(a[k][j]==1)x=1;
	}
	return x;
}
int cat2(int a[30][30],int i,int j,int b)//向下找
{
	int x=0;
	for(int k=i+1;k<=b;k++)
	{
		if(a[k][j]==1)x=1;
	}
	return x;
}
int cat3(int a[30][30],int i,int j)//向左找
{
	int x=0;
	for(int k=j-1;k>=0;k--)
	{
		if(a[i][k]==1)x=1;
	}
	return x;
}
int cat4(int a[30][30],int i,int j,int b)//向右找
{
	int x=0;
	for(int k=j+1;k<=b;k++)
	{
		if(a[i][k]==1)x=1;
	}
	return x;
}
int main()
{
	int a;
	scanf("%d",&a);
	int b[30][30],b1[30][30];
	for(int i=0;i<a;i++)
	{
		for(int j=0;j<a;j++)
		{
			scanf("%d",&b[i][j]);
			b1[i][j]=b[i][j];
		}
	}
	for(int i=1;i<a-1;i++)
	{
		for(int j=1;j<a-1;j++)
		{
			if(b[i][j]==0){
				int x=0;
				x=cat1(b,i,j)+cat2(b,i,j,a)+cat3(b,i,j)+cat4(b,i,j,a);
				if(x==4)
				{
					if(b1[i-1][j]==0||b1[i+1][j]==0||b1[i][j-1]==0||b1[i][j+1]==0)b[i][j]=2;
				}
			}
		}
	}
	for(int i=0;i<a;i++)
	{
		for(int j=0;j<a;j++)
		{
			if(j!=a-1)printf("%d ",b[i][j]);
			else printf("%d\n",b[i][j]);
		}
	}
	return 0;
}

题目背景

在峰会期间,武装部队得处于高度戒备。警察将监视每一条大街,军队将保卫建筑物,领空将布满了 F-2003 飞机。

此外,巡洋船只和舰队将被派去保护海岸线。不幸的是,因为种种原因,国防海军部仅有很少的几位军官能指挥大型海战。因此,他们培养了一些新海军指挥官。军官们选择了“海战”游戏来帮助他们学习。

题目描述

在一个方形的盘上,放置了固定数量和形状的船只,每只船却不能碰到其它的船。在本题中,我们认为船是方形的,所有的船只都是由图形组成的方形。

求出该棋盘上放置的船只的总数。

输入格式

第一行为两个整数 R 和 C,用空格隔开,分别表示游戏棋盘的行数和列数。

接下来 R行,每行 C 个字符,为 “#”或“.“#” 表示船只的一部分,“. 表示水。

输出格式

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

输入输出样例

输入 

6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#

输出 

There are 5 ships.

说明/提示

对于 100% 的数据,1≤R,C≤1000。

写错的代码:

#include<stdio.h>
int x1,y11,x2,y2,x3,y3,x4,y4;
int cat(char c[][1000],int i,int j,int a,int b,int *x1,int *x2,int *x3,int *x4,int *y1,int *y2,int *y3,int *y4)
{
	int x=1;
	int su1(char c[][1000],int i,int j,int a,int b,int *x3,int *y3);
	for(int k=j;k<b;k++)
	{
		if(c[i][k]!='#'){
			if(*x1==*x3&&*x2==*x4&&*y1==*y2&&*y3==*y4&&x)return 1;
			else return 0;
		}
		if(*x1==*x3&&*x2==*x4&&*y1==*y2&&*y3==*y4);
		else x=0;
		if(c[i+1][k]=='#')su1(c,i,k,a,b,x3,y3);//su1
	}
	return x;
}
int su1(char c[][1000],int i,int j,int a,int b,int *x3,int *y3)
{
	int heng1(char c[][1000],int i,int j,int a,int b,int *x1,int *y11);
	int heng2(char c[][1000],int i,int j,int a,int b,int *x4,int *y4);
	for(int k=i+1;k<a;k++)
	{
		if(c[k][j]!='#'&&c[k][j]!='*')break;
		if(*x3>j)*x3=j;
		if(*y3<k)*y3=k;
		if(j>0){
			if(c[k][j-1]=='#')heng1(c,i,j,a,b,&x1,&y11);
		}
		if(c[k][j+1]=='#')heng2(c,i,j,a,b,&x4,&y4);
		c[k][j]='*';
	}
	return 0;
}
int su2(char c[][1000],int i,int j,int a,int b,int *x2,int *y2)
{
	int heng1(char c[][1000],int i,int j,int a,int b,int *x1,int *y11);
	int heng2(char c[][1000],int i,int j,int a,int b,int *x4,int *y4);
	for(int k=i-1;k>=0;k--)
	{
		if(c[k][j]!='#'&&c[k][j]!='*')break;
		if(*x2<j)*x2=j;
		if(*y2>k)*y2=k;
		if(c[k][j-1]=='#')heng1(c,i,j,a,b,&x1,&y11);
		if(c[k][j+1]=='#')heng2(c,i,j,a,b,&x4,&y4);
		c[k][j]='*';
	}
	return 0;
}
int heng1(char c[][1000],int i,int j,int a,int b,int *x1,int *y11)
{
	for(int k=j-1;k>=0;k--)
	{
		if(c[i][k]!='#'&&c[i][k]!='*')break;
		if(*x1>k)*x1=k;
		if(*y11>i)*y11=i;
		if(c[i-1][k]=='#')su2(c,i,k,a,b,&x2,&y2);
		if(c[i+1][k]=='#')su1(c,i,k,a,b,&x3,&y3);
		c[i][k]='*';
	}
	return 0;
}
int heng2(char c[][1000],int i,int j,int a,int b,int *x4,int *y4)
{
	for(int k=j+1;k<b;k++)
	{
		if(c[i][k]!='#'&&c[i][k]!='*')break;
		if(*x4<k)*x4=k;
		if(*y4<i)*y4=i;
		if(c[i-1][k]=='#')su2(c,i,k,a,b,&x2,&y2);
		if(c[i+1][k]=='#')su1(c,i,k,a,b,&x3,&y3);
		c[i][k]='*';
	}
	return 0;
}
int main()
{
	int a,b,count=0;
	scanf("%d %d",&a,&b);
	char c[a][b+1];
	for(int i=0;i<a;i++)
	{
		scanf("%s",c[i]);
	}
	for(int i=0;i<a;i++)
	{
		for(int j=0;j<b;j++)
		{
			if(c[i][j]=='#'){
				x1=j,x2=j,x3=j,x4=j;
				y11=i,y2=i,y3=i,y4=i;
				if(cat(c,i,j,a,b,&x1,&x2,&x3,&x4,&y11,&y2,&y3,&y4))count++;
				else {
					printf("Bad placement.");
					return 0;
				}
			}
		}
	}
	printf("There are %d ships.",count);
	return 0;
}

声明:所用题皆来自刷题网,作者仅用来向组织反馈学习情况,无任何盈利行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值