给一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
解题思路:将目标单词放入数组中,将图中的单词中的字母转化为它在字母中的位置,替他字母变为*,然后再新的表中找到0,从该点一直往一个方向延申,如果找到一个单词,找到其起始位置,然后在一个新的数组的该位置沿相同方向放入单词字母,循环该操作。
#include<iostream>
using namespace std;
char a[105][105],b[100][100],s[]={"yizhong"};
int n,k;
void dfs(int x,int y,int step)
{
int next[8][2]={{1,1},{1,-1},{-1,1},{-1,-1},{0,1},{0,-1},{1,0},{-1,0}};
int i,nx,ny;
//printf("x=%d\n",step);
for(i=0;i<8;i++)
{
nx=x,ny=y;
step=0;
while(step<=6&&a[nx][ny]-'0'==step)
{
nx=nx+next[i][1];
ny=ny+next[i][0];
step++;
//printf("%d ",step);
}
if(step==7)//找到一个完整单词
{
nx=x-next[i][1];
ny=y-next[i][0];//单词起始位置坐标
//printf("%d %d %d %d\n",nx,ny,x,y);
for(int j=0;j<7;j++)
{
nx=nx+next[i][1];//单词延申方向
ny=ny+next[i][0];
b[nx][ny]=s[j];
}
}
}
}
int main()
{
scanf("%d",&n);
getchar();//回收前面的换行符
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
cin>>a[i][j];
if(a[i][j]=='y')
a[i][j]='0';
else if(a[i][j]=='i')
a[i][j]='1';
else if(a[i][j]=='z')
a[i][j]='2';
else if(a[i][j]=='h')
a[i][j]='3';
else if(a[i][j]=='o')
a[i][j]='4';
else if(a[i][j]=='n')
a[i][j]='5';
else if(a[i][j]=='g')
a[i][j]='6';
else
a[i][j]='*';
}
getchar();
}//形成新的地图
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
b[i][j]='*';
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(a[i][j]=='0')
dfs(i,j,0);
}
}
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
cout<<b[i][j];
}
printf("\n");
}
}
开始时用的scanf输入,结果全部wc了,后来改成cin输入后就只有1个没有ac了,找了好久错误没找到,后来看到有网友说用o2优化,试了一下,结果ac了
题目描述
Perket 是一种流行的美食。为了做好 Perket,厨师必须谨慎选择食材,以在保持传统风味的同时尽可能获得最全面的味道。你有 nn 种可支配的配料。对于每一种配料,我们知道它们各自的酸度 ss 和苦度 bb。当我们添加配料时,总的酸度为每一种配料的酸度总乘积;总的苦度为每一种配料的苦度的总和。
众所周知,美食应该做到口感适中,所以我们希望选取配料,以使得酸度和苦度的绝对差最小。
另外,我们必须添加至少一种配料,因为没有任何食物以水为配料的。
输入格式
第一行一个整数 nn,表示可供选用的食材种类数。
接下来 nn 行,每行 22 个整数 s_isi 和 b_ibi,表示第 ii 种食材的酸度和苦度。
输出格式
一行一个整数,表示可能的总酸度和总苦度的最小绝对差。
输入输出样例
输入 #1复制
1 3 10
输出 #1复制
7
输入 #2复制
2 3 8 5 8
输出 #2复制
1
输入 #3复制
4 1 7 2 6 3 8 4 9
输出 #3复制
1
说明/提示
数据规模与约定
对于 100\%100% 的数据,有 1 \leq n \leq 101≤n≤10,且将所有可用食材全部使用产生的总酸度和总苦度小于 1 \times 10^91×109,酸度和苦度不同时为 11 和 00。
解题思路:遍历所有混合情况,找到最优解
*用结构体将每种配料的酸和苦度绑定在一起
#include<iostream>
using namespace std;
struct note
{
int s;
int k;
};
struct note a[15];
int j=1,h=0,x=0,m=100000,vis[15]={0},n;//j酸度的乘积,h苦度和
void dfs()
{
for(int i=0;i<n;i++)
{
if(vis[i]==0){
j=j*a[i].s;
h=h+a[i].k;
x=abs(h-j);
vis[i]=1;
if(m>x)
m=x;//找到最小的
dfs();
j=j/a[i].s;
h=h-a[i].k;
vis[i]=0;//回溯
}
}
}
int main()
{
int i;
scanf("%d",&n);
for(i=0; i<n; i++)
{
cin>>a[i].s>>a[i].k;
}
dfs();
printf("%d",m);
}
每日总结:可怡多用c++的输入输出,因为不用考虑类型,减少出错。