這題讀完想了一會,沒有什麼思路,不知道如何處理‘\’和‘/’,因為它們是“牆”,但是這牆是具有方向性的;而且沒有路,輸入全部由“牆”組成,與以往做過的圖找路徑的題目有很大的不同,一時沒有辦法。
後來看了網上的思路,覺得非常好。做法就是把原圖放大2倍或3倍。放大2倍是指用2*2的0-1矩陣表示‘\’或‘/’
具體為‘\’表示成1 0 '/'表示成 0 1
0 1 1 0
同理,放大三倍的表示方法為:
‘\’表示為1 0 0 ‘/’表示為0 0 1
0 1 0 0 1 0
0 0 1 1 0 0
這樣做的好處是放大了牆,從而產生了路。0表示路,1表示牆,處理起來就方便多了。放大2倍每步要考慮8個方向,放大3倍考慮4個方向即可。
附上AC代碼,一次AC!
#include#include using namespace std; int w,h,circles,maxroad,map[250][250]; int dr[4]={-1,0,1,0}; int dc[4]={0,1,0,-1}; bool ok=1,visit[250][250]; void fill(int type,int row,int column){ if (type==1){ map[row][column]=1;map[row][column+1]=0;map[row][column+2]=0; map[row+1][column]=0;map[row+1][column+1]=1;map[row+1][column+2]=0; map[row+2][column]=0;map[row+2][column+1]=0;map[row+2][column+2]=1; } else{ map[row][column]=0;map[row][column+1]=0;map[row][column+2]=1; map[row+1][column]=0;map[row+1][column+1]=1;map[row+1][column+2]=0; map[row+2][column]=1;map[row+2][column+1]=0;map[row+2][column+2]=0; } } int dfs(int row,int column,int &steps){ int nr,nc; for (int i=0;i<4;i++){ nr=row+dr[i]; nc=column+dc[i]; if (nr<0||nr>=3*h||nc<0||nc>=3*w||visit[nr][nc]==-1) { ok=0; visit[row][column]=-1; } else if (visit[nr][nc]==0&&map[nr][nc]==0) { visit[nr][nc]=1; steps++; dfs(nr,nc,steps); } } return steps; } void init() { circles=0; maxroad=0; ok=1; memset(visit,0,sizeof(visit)); } int main(){ int col=0; while(cin>>w>>h&&w) { init(); col++; for (int i=0;i >c; if (c=='\\') fill(1,3*i,3*j); else if (c=='/') fill(2,3*i,3*j); else cout<<"wrong input!"< maxroad) maxroad=count; } } } } cout<<"Maze #"< 0) cout<