学习目录
1.背英语4级词汇2小时
2.刷题
3.尝试修改没有AC的题目并使其AC
4.复习链表相关知识
刷题
1.
P1101 单词方阵
题目描述
给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入格式
第一行输入一个数nn。(7 \le n \le 1007≤n≤100)。
第二行开始输入n \times nn×n的字母矩阵。
输出格式
突出显示单词的n \times nn×n矩阵。
输入输出样例
输入 #1复制
7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa
输出 #1复制
******* ******* ******* ******* ******* ******* *******
输入 #2复制
8 qyizhong gydthkjy nwidghji orbzsfgz hhgrhwth zzzzzozo iwdfrgng yyyygggg
输出 #2复制
*yizhong gy****** n*i***** o**z**** h***h*** z****o** i*****n* y******g
#include<stdio.h>
int n,k,m;
char a[105][105],b[105][105];//a用于存储输入的字符坐标系,b用于存放处理后需要输出的字符
int dx[8]={1,-1,0,0,1,-1,-1,1};
int dy[8]={0,0,1,-1,1,1,-1,1};
void dfs(int x,int y,int z)
{
int tx=x+dx[z];//移动后的位置
int ty=y+dy[z];
if(k>=7)
{
m=1;
return;
}
if(tx<0||tx>=n||ty<0||ty>=n)
return;
if((a[x][y]=='y'&&a[tx][ty]=='i')||(a[x][y]=='i'&&a[tx][ty]=='z')||(a[x][y]=='z'&&a[tx][ty]=='h')||(a[x][y]=='h'&&a[tx][ty]=='o')||(a[x][y]=='o'&&a[tx][ty]=='n')||(a[x][y]=='n'&&a[tx][ty]=='g'))
{
k++;
dfs(tx,ty,z);
if(!m)//如果不能构成'yizhong'字符串就结束
return;
b[tx][ty]=a[tx][ty];
}
return;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",a[i]);//输入每行字符串
for(int i=0;i<=104;i++)
for(int j=0;j<=104;j++)
b[i][j]='*';//默认为不能输出
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(a[i][j]=='y')//首字母出现,开始后续判断
for(int l=0;l<8;l++)
{
k=1,m=0;//开始判断
if(a[i+dx[l]][j+dy[l]]=='i')//判断每一个方向
dfs(i,j,l);
if(m)//如果满足条件,就把最后一个'y'放到b[i][j]中
b[i][j]='y';//最后把'y'
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%c",b[i][j]);
printf("\n");
}
return 0;
}
题解:首先,单词开头的字母是y,那就把这个当做一个判定条件,若在遍历的过程中发现了y,那就开始对其周围的字母进行搜索,并一个接一个对着单词里的字母进行搜索,最后输出。
2.
P1162 填涂颜色
题目描述
由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=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
输入格式
每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)
接下来nn行,由00和11组成的n \times nn×n的方阵。
方阵内只有一个闭合圈,圈内至少有一个00。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式
已经填好数字22的完整方阵。
输入输出样例
输入 #1复制
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
输出 #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
说明/提示
1 \le n \le 301≤n≤30
#include<stdio.h>
int a[100][100],b[100][100];
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};//第一个表示不动,后面的四个分别是上下左右四个方向
int n;
void dfs(int x,int y)
{
int i;
if (x<0||x>n+1||y<0||y>n+1||a[x][y]!=0)
return;//
a[x][y]=1;//染色
for(i=1;i<=4;i++)
dfs(x+dx[i],y+dy[i]);//向四个方向搜索
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
scanf("%d",&b[i][j]);
if(b[i][j]==0)
a[i][j]=0;
else
a[i][j]=2;
}
dfs(0,0);
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
if (a[i][j]==0)
printf("2 ");
else
printf("%d ",b[i][j]);
printf("\n");
}
}
题解:第一次交的时候发现如果在遇到三边是1而有一边是空的时候,也会将其判断为染色区域,于是修改后AC。
总结:今天还补了另外2道题(补完任务就能达标),但还是不能AC,正在写一道题(流星雨),但样例输入不正确,可能是思路有误,明天和同学交流一下看看能否解决,今天复习了链表的相关知识,刷了2个链表的题(以前写过,算是复习吧)。