心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
经典搜索问题。
以下是我的代码:
/*
 * Author:  lee1r
 * Created Time:  2011/8/6 7:47:26
 * File Name: poj2488.cpp
 
*/
#include
<iostream>
#include
<sstream>
#include
<fstream>
#include
<vector>
#include
<list>
#include
<deque>
#include
<queue>
#include
<stack>
#include
<map>
#include
<set>
#include
<bitset>
#include
<algorithm>
#include
<cstdio>
#include
<cstdlib>
#include
<cstring>
#include
<cctype>
#include
<cmath>
#include
<ctime>
#define L(x) ((x)<<1)
#define R(x) (((x)<<1)+1)
#define Half(x) ((x)>>1)
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int kInf(0x7f7f7f7f);
const double kEps(1e-8);
typedef 
long long int64;
typedef unsigned 
long long uint64;

const int kMaxn(27);
const int dx[]={-2,-2,-1,1,2,2,1,-1},dy[]={-1,1,2,2,1,-1,-2,-2};

int n,m;
string ans,d;
bool used[kMaxn][kMaxn];

string itoa(int x)
{
    
string re,t;
    
while(x>0)
    {
        t
+=(x%10+'0');
        x
/=10;
    }
    
for(int i=t.size()-1;i>=0;i--)
        re
+=t[i];
    
return re;
}

void erase(string &t)
{
    
int pos;
    
for(pos=t.size()-1;pos>=0;pos--)
        
if(isalpha(t[pos]))
            
break;
    t.erase(pos,t.size()
-pos);
}

void dfs(int depth,int x,int y)
{
    
if(ans<=d)
        
return;
    
if(depth>n*m)
    {
        ans
=d;
        
return;
    }
    
for(int i=0;i<8;i++)
    {
        
int newx(x+dx[i]),newy(y+dy[i]);
        
if(newx<1 || newx>|| newy<1 || newy>|| used[newx][newy])
            
continue;
        d
+=(char)(newx+'A'-1);
        d
+=itoa(newy);
        used[newx][newy]
=true;
        dfs(depth
+1,newx,newy);
        erase(d);
        used[newx][newy]
=false;
    }
}

int main()
{
    
//freopen("data.in","r",stdin);
    
    
int T;
    scanf(
"%d",&T);
    
for(int case_num=1;case_num<=T;case_num++)
    {
        scanf(
"%d%d",&m,&n);
        ans
="z";
        
for(int i=1;i<=min(Half(n)+1,n);i++)
            
for(int j=1;j<=min(Half(m)+1,m);j++)
            {
                d
+=(char)(i+'A'-1);
                d
+=itoa(j);
                used[i][j]
=true;
                dfs(
2,i,j);
                erase(d);
                used[i][j]
=false;
            }
        
        printf(
"Scenario #%d:\n",case_num);
        
if(ans<"z")
            cout
<<ans<<endl;
        
else
            cout
<<"impossible"<<endl;
        cout
<<endl;
    }
    
    
return 0;
}
posted on 2011-08-06 08:25 lee1r 阅读(177) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:搜索

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理