您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  include system c