洛谷 P1101 單詞方陣
阿新 • • 發佈:2018-03-04
個數 算法 span dfs include space == tchar IT
不算搜索的搜索
思路和很多人的一樣,因為只要找到兩個字母,方向就確定了,記錄下方向,剩下的暴力即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int fx[9][2]={{0,0},{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}};//存方向,循環起來比較方便
char map[101][101], word[8]={‘!‘,‘y‘,‘i‘,‘z‘,‘h‘,‘o‘,‘n‘,‘g‘};//word存需要比對的字母
bool a[101][101];//記錄單詞的位置
int jl[10][2],k; //jl用來存字母的坐標,當七個字母全找完統一賦值
//k用來存方向
void dfs(int x,int y,int z)
{
if(z==1)
{
for(int m=1;m<=8;m++)//枚舉方向
{
if(map[x+fx[m][0]][y+fx[m][1]]==word[2])//兩個字母確定方向
{
k=m; //記錄方向
jl[z][0 ]=x,jl[z][1]=y; //存坐標
dfs(x+fx[k][0],y+fx[k][1],2); //向下尋找
}
}
}
int tot=1; //記錄匹配的字母個數
for(int m=2;m<=7;m++)
{
if(map[x+(m-2)*fx[k][0]][y+(m-2)*fx[k][1]]==word[m]) //不斷向下匹配
{
tot=m;
jl[m][0]=x+(m-2)*fx[k][0]; //記錄坐標
jl[m][1]=y+(m-2)*fx[k][1];
}
else
break;
}
if(tot==7) //如果字母全部匹配
{
for(int w=1;w<=7;w++)
{
a[jl[w][0]][jl[w][1]]=1; //統一賦值
}
}
}
int main()
{
//輸入,防止意外,用getchar()讀掉換行符
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}
getchar();
}
//算法主體
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(map[i][j]==‘y‘)
{
dfs(i,j,1);
}
}
//輸出
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j])
printf("%c",map[i][j]);
else
printf("*");
}
cout<<endl;
}
return 0;
}
洛谷 P1101 單詞方陣