luogu P1101 單詞方陣【dfs】

題目描述
給一nXn的字母方陣,內可能蘊含多個“yizhong”單詞。單詞在方陣中是沿着同一方向連續擺放的。擺放可沿着8個方向的任一方向,同一單詞擺放時不再改變方向,單詞與單詞之間[color=red]可以[/color]交叉,因此有可能共用字母。輸出時,將不是單詞的字母用“*”代替,以突出顯示單詞。例如:
輸入:
8 輸出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
輸入輸出格式
輸入格式:

第一行輸入一個數n。(7<=n<=100)。
第二行開始輸入nXn的字母矩陣。

輸出格式:

突出顯示單詞的nXn矩陣。

輸入輸出樣例
輸入樣例#1: 複製
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
輸出樣例#1: 複製





#include<iostream>
using namespace std;
const int maxn=100+5;
int d[8][2]={{1,1},{1,-1},{-1,1},{-1,-1},{1,0},{0,1},{-1,0},{0,-1}};
char cmp[7]={'y','i','z','h','o','n','g'} ;//用來匹配

int n;

bool mark[maxn][maxn]={0}; //圖的標記 
char map[maxn][maxn]; //圖 

void init(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)   cin>>map[i][j];
}
void print(){
    int i,j;
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++)   
        {
            if(mark[i][j])
                cout<<map[i][j];
            else cout<<"*";
        }
        cout<<endl;
    }
}
inline void check(int x,int y){
    int i,j,k;
    for(k=0;k<8;k++){
        for(i=1;i<=6;i++){
            int nx=x+i*d[k][0],ny=y+i*d[k][1];
            if(nx<1||nx>n||ny<1||ny>n) break; //越界
            if(map[nx][ny]!=cmp[i]) break;
        }
        if(i==7)
            for(j=0;j<=6;j++) mark[x+d[k][0]*j][y+d[k][1]*j]=1; //標記這些爲真
    }
}
void solve(){
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(map[i][j]=='y')  check(i,j);
}
int main(){
    init(); //輸入 
    solve();//解決 
    print();//輸出 
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章