POJ 2488 回溯
2010-07-28 20:38
471 查看
#include <cstdlib> #include <iostream> #include <cstring> using namespace std; class problem{ static int dx[8]; static int dy[8]; const static int MAX=50*50,R=26,C=26; bool v[R][C]; int cnt,r,c,rc; char pathr[MAX+1]; int pathc[MAX+1]; void DFS(int,int); bool inside(int x,int y){ return x>=0&&y>=0&&x<r&&y<c; } public: void set(int,int); void solve(); }; int problem::dx[8]={-2, -2, -1, -1, 1, 1, 2, 2}; int problem::dy[8]={-1, 1, -2, 2, -2, 2, -1, 1}; void problem::DFS(int x,int y){ cnt++;v[x][y]=true; pathr[cnt]='A'+x; pathc[cnt]=y+1; if(cnt==rc){ for(int i=1;i<=rc;++i) cout<<pathr[i]<<pathc[i]; cout<<endl; return; } for(int i=0;i<8;i++) if(cnt!=rc){ int tx=x+dx[i]; int ty=y+dy[i]; if(inside(tx,ty)&&!v[tx][ty]) DFS(tx,ty); } else break; if(cnt!=rc){ cnt--;v[x][y]=false; } } void problem::set(int p,int q){ r=p;c=q;rc=p*q; cnt=0; memset(v,0,sizeof v); } void problem::solve(){ DFS(0,0); if(cnt!=rc) cout<<"impossible"<<endl; } int main(int argc, char *argv[]){ problem knight_move; int T,p,q; cin>>T; for(int i=1;i<=T;++i){ cin>>p>>q; cout<<"Scenario #"<<i<<":"<<endl; knight_move.set(q,p); knight_move.solve(); if(i!=T)cout<<endl; } system("PAUSE"); return EXIT_SUCCESS; }
相关文章推荐
- 经典回溯——POJ 2488
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ 2488 A Knight's Journey【DFS + 回溯应用】
- POJ-2488 国际象棋马的走法 (深度优先搜索和回溯)
- poj 2488 深搜+回溯
- POJ 2488 DFS+回溯
- POJ 2488 A Knight's Journey(DFS+回溯)
- POJ 2488 A Knight's Journey DFS 深搜回溯
- POJ 2488 A Knight's Journey 递归回溯题解
- poj2488 回溯 注意字典 边缘的处理思想
- POJ训练计划2488_A Knight's Journey(DFS+回溯)
- POJ-2488(回溯+剪枝)
- poj 2488 dfs+回溯
- poj 2488
- POJ 2488 A Knight's Journey
- http://poj.org/problem?id=2488
- poj 2488 搜索
- poj_1256_回溯
- POJ-2488 A Knight's Journey
- Poj 2488 A Knight's Journey