洛谷:单词方阵
和前天的思路是一样的,不过没再用数组将需要对比的字母装起来了;
题解:
【1】首先输入这个单词矩阵(一定要注意字符数组的特殊性)//前面卡了挺久,有这个原因
【2】找到单词首字母’y’,从它开始搜索
【3】分八个方向,题中说一个单词只会在一个方向上(所以把方向也当作了一个参数)
【4】如果搜索时,该方向上的字母和单词相同位置的字母是相同的,且下一个字母也满足这样的条件(这里可以用返回值,来判断),就可以将这个位置标记,这一步旨在,将上一个字母和下一个字母联系起来
【5】如果一次性找到了单词的最后位置,那么就代表这里有一个单词(被标记的单词),所以dfs();函数中还需要传一个参数,代表比较到第几位了
[6]如果一直能比到最后一位就代表是这个单词
#include
int n;
char str[101][101];
int way[101][101];
int dir[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,1}};
char word[]="yizhong";
void print()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(way[i][j]!=1)
{
str[i][j]='*';
}
printf("%c",str[i][j]);
}
printf("\n");
}
return;
}
int dfs(int x,int y,int d,int step)
{
//最后一个单词
if(step==6)
{
way[x][y]=1;
return 1;
}
//没到最后一个单词(需要满足条件)
int nx=x+dir[d][0];
int ny=y+dir[d][1];
//条件:
//不超过边界&&该位置的字母与相对应的单词位置相同的字母相同&&下一个字母也满足上一个条件
if(nx>=0&&ny>=0&&nx<n&&ny<n&&str[nx][ny]==word[step+1]&&dfs(nx,ny,d,step+1)==1)
{
way[nx][ny]=1;
return 1;
}
return 0;
}
int main()
{
scanf("%d",&n);
//一定要注意字符矩阵的输入,每次到这里就错
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(str[i][j]=='y')
{
for(int d=0;d<8;d++)
{
if(dfs(i,j,d,0)==1)
way[i][j]=1;
}
}
}
}
print();
return 0;
}
洛谷:填涂颜色
(和水坑有点关系)
题解:
只要把1外面的0改变一下,等将包围圈里面的0改为2了,再将外面被改变的0改回去就行了
(为了将最外圈的0都可以被搜到,我在最外圈的基础上还加了一个全是0的圈,这样就将整个地图连起来了)
#include
int str[35][35]={0};
int n;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void print()
{
//printf("\n");
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n+1;j++)
{
if(str[i][j]==0)
{
str[i][j]=2;
}
if(str[i][j]==7)
{
str[i][j]=0;
}
printf("%d ",str[i][j]);
}
printf("\n");
}
return;
}
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=0&&ny>=0&&nx<=n+1&&ny<=n+1&&str[nx][ny]==0)
{
str[nx][ny]=7;
dfs(nx,ny);
}
}
return;
}
int main()
{
//int cout=0;
char c;
scanf("%d",&n);
//getchar();
for(int i=1;i<n+1;i++)
{
for(int j=1;j<n+1;j++)
{
scanf("%d",&str[i][j]);
}
}
dfs(0,0);
print();
//printf("%d\n",cout);
return 0;
}
洛谷:马的遍历
用DFS写的超时,但还是把代码贴一下
//这个题如果用 dfs 的话只能部分AC,因为会超时
#include
int dir[8][2]={{-2,-1},{-2,1},{2,1},{2,-1},{1,-2},{1,2},{-1,2},{-1,-2}};
int n,m,x,y;
int min=1e9;
int way[405][405]={0};
int dfs(int sx,int sy,int fx,int fy,int step)
{
if(sx==fx&&sy==fy)
{
//printf("#####\n");
if(min>step)
{
min=step;
}
// printf("%d\n",min);
// //return 1;
}
for(int i=0;i<8;i++)
{
int nx=sx+dir[i][0];
int ny=sy+dir[i][1];
if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&way[nx][ny]==0)//&&way[nx][ny]==0)
{
way[nx][ny]=1;
dfs(nx,ny,fx,fy,step+1);
way[nx][ny]=0;
}
}
}
int main()
{
int num=-1;
scanf("%d %d %d %d",&n,&m,&x,&y);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
min=1e9;
way[1][1]=1;
dfs(x,y,i,j,0);
if(min!=1e9)
printf("%-5d",min);
else
printf("%-5d",num);
}
printf("\n");
}
return 0;
}
听了网课,听那个BFS的实现