洛谷 P1101 单词方阵
生活随笔
收集整理的這篇文章主要介紹了
洛谷 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];elsecout<<"*";}cout<<endl;} }轉載于:https://www.cnblogs.com/baccano-acmer/p/9831769.html
總結
以上是生活随笔為你收集整理的洛谷 P1101 单词方阵的全部內容,希望文章能夠幫你解決所遇到的問題。