洛谷 P1101 单词方阵

DFS的例题,难点在于所选的yizhong必须是一行的不能拐弯,我第一次写的时候直接在DFS里的判断条件里加了if(当前位置的字符==yizhong相应位置的字符)这样的语句,当然这样不对,因为没有保证拐弯的问题。怎样去保证不拐弯呢,只需要定义一个八向的二维数组,然后寻找到y的时候再去找i找到i就把这个k传入进DFS以后方向就是这个k。因为已经定好了方向所以不用担心越界重复等问题,如果有问题直接return不会在相应的记录状态数组上记录。还有的问题就是要用char的二维数组我不知道为什么用string一个for一直错,让我还以为是算法错了

经过试验发现数组可以保证有负数的下标而不终止程序,string不能忍受,所以在最开始的时候用string就会出现负数的下标

代码 (算法借鉴)

#include <bits/stdc++.h>
using namespace std;
int bk[110][110];
char st[110][110];
int dir[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char yz[]="yizhong";
struct node
{
    int x,y;
}p[110];
void dfs(int x,int y,int id,int k)
{
    if(id==7)
    {
        for(int i=0;i<7;i++)
        bk[p[i].x][p[i].y]=1;
    }
    else
    {
        int xx=x+dir[k][0];
        int yy=y+dir[k][1];
        if(id==6||st[xx][yy]==yz[id+1])
        {
            p[id].x=x;p[id].y=y;
            dfs(xx,yy,id+1,k);
        }
    }
}
main()
{
    //freopen("data.in","r",stdin); 
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    cin>>st[i];
    for(int i=0;i<n;i++)
    for(int j=0;j<n;j++)
    if(st[i][j]=='y')
    {
        for(int k=0;k<8;k++)
        {
            int x=i+dir[k][0];
            int y=j+dir[k][1];
            if(st[x][y]=='i')
            dfs(i,j,0,k);
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(bk[i][j])
            cout<<st[i][j];
            else
            cout<<"*";
        }
        cout<<endl;
    }
} 
原文地址:https://www.cnblogs.com/baccano-acmer/p/9831769.html