题目描述
由数字 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;
}
声明:所用题皆来自刷题网,作者仅用来向组织反馈学习情况,无任何盈利行为。