(DFS)跳马
題目:
馬走日,不考慮別馬腳,問馬能否從S走到T,其中‘#’表示不能落下,‘.’表示能落下
輸入:
輸出:
Yes分析與解答:
如果在for的下面加上回溯vis[x][y]=false;,時間超時,有的時候如果只用考慮能否到達,而不用考慮具體路徑,只用增加一個全局變量f,能走到的話就f就為true了,不能的話dfs函數全部遍歷一遍,也沒改變f,此時f就是初始的false。不用加上回溯。
憑感覺來說,整個完整搜索樹的時間要小于通過回溯找到路徑的最壞的可能時間。所以說,如果只用考慮能否到達,那就不用回溯。
代碼:
#include<iostream> #include<string> using namespace std; string maze[12]; bool vis[15][15]; int dir[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};//行,列 bool f; int in (int x,int y){if(0<=x&&x<10&&0<=y&&y<9){return 1;}else return 0; } void dfs(int x,int y){vis[x][y]=true;if(f){return ;}if(maze[x][y]=='T'){f=true;return ;}for(int i=0;i<8;++i){int tx=x+dir[i][0];int ty=y+dir[i][1];if(in(tx,ty)&&maze[tx][ty]!='#'&&!vis[tx][ty]){dfs(tx,ty);}} }int main(){for(int i=0;i<10;++i){cin>>maze[i];} int x,y;for(int i=0;i<10;++i){for(int j=0;j<9;++j){if(maze[i][j]=='S'){x=i;y=j;}}}dfs(x,y);if(f){cout<<"Yes";}else{cout<<"No";}}總結
- 上一篇: liunx php apache2,li
- 下一篇: 计算机语言中tc是什么,新人必须了解的几