POJ 2488

来源:互联网 发布:moonlight软件下载 编辑:程序博客网 时间:2024/06/01 07:46

题目链接:http://poj.org/problem?id=2488

——————————————————————————————————————

题目描述:

象棋,马走日字,问能否不重复的走完所有格子,不限起点终点。

输出字典序最小。

——————————————————————————————————————

题目思路:

直接搜索。dfs。

——————————————————————————————————————

题目细节:

1、要求字典序最小,这地方有点问题。对于每一步棋,都是字母排在前面,数字排在后面,所以我们优先选字母小的,字母相同时选数字小的就可以了。这里一开始没有注意到,wa了。

2、关于为什么可以搜索(?????)

3、事先可枚举好能够走的方式:

int dir[8][2]={-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1};   

——————————————————————————————————————

源代码:

#include <iostream>#include<stdio.h>#include<stdlib.h>#include<cstring>using namespace std;int flag[27][27];int path[27];int q = 0,p = 0;int dfs(int cur,int i,int j){    if(cur == q*p+1)      return 1;    if(i>2 && j>1)    {        if(flag[i-2][j-1] == 0)        {            flag[i-2][j-1] = 1;            path[cur] = (i-2)*100+j-1;            if(dfs(cur+1,i-2,j-1))              return 1;            flag[i-2][j-1] = 0;        }    }    if(i>2 && j<=p-1)    {        if(flag[i-2][j+1] == 0)        {            flag[i-2][j+1] = 1;            path[cur] = (i-2)*100+j+1;            if(dfs(cur+1,i-2,j+1))              return 1;            flag[i-2][j+1] = 0;        }    }    if(i>1 && j>2)    {        if(flag[i-1][j-2] == 0)        {            flag[i-1][j-2] = 1;            path[cur] = (i-1)*100+j-2;            if(dfs(cur+1,i-1,j-2))              return 1;            flag[i-1][j-2] = 0;        }    }    if(i>1 && j<=p-2)    {        if(flag[i-1][j+2] == 0)        {            flag[i-1][j+2] = 1;            path[cur] = (i-1)*100+j+2;            if(dfs(cur+1,i-1,j+2))              return 1;            flag[i-1][j+2] = 0;        }    }    if(i<=q-1 && j>2)    {        if(flag[i+1][j-2] == 0)        {            flag[i+1][j-2] = 1;            path[cur] = (i+1)*100+j-2;            if(dfs(cur+1,i+1,j-2))              return 1;            flag[i+1][j-2] = 0;        }    }    if(i<=q-1 && j<=p-2)    {        if(flag[i+1][j+2] == 0)        {            flag[i+1][j+2] = 1;            path[cur] = (i+1)*100+j+2;            if(dfs(cur+1,i+1,j+2))              return 1;            flag[i+1][j+2] = 0;        }    }    if(i<=q-2 && j>1)    {        if(flag[i+2][j-1] == 0)        {            flag[i+2][j-1] = 1;            path[cur] = (i+2)*100+j-1;            if(dfs(cur+1,i+2,j-1))              return 1;            flag[i+2][j-1] = 0;        }    }    if(i<=q-2 && j<=p-1)    {        if(flag[i+2][j+1] == 0)        {            flag[i+2][j+1] = 1;            path[cur] = (i+2)*100+j+1;            if(dfs(cur+1,i+2,j+1))              return 1;            flag[i+2][j+1] = 0;        }    }    return 0;}int main(){    int t = 0;    int k = 0,j = 0,i = 0;    int f = 0;    scanf("%d",&t);    for(k = 1;k<=t;k++)    {        memset(flag,0,sizeof(flag));        f = 0;        scanf("%d%d",&p,&q);        for(i = 1;i<=q;i++)        {          for(j = 1;j<=p;j++)          {              path[1] = j+i*100;              flag[i][j] = 1;              if(dfs(2,i,j))              {                f = 1;                break;              }              flag[i][j] = 0;          }          if(f == 1)            break;        }        printf("Scenario #%d:\n",k);        if(f == 0)          printf("impossible\n");        else        {            for(i = 1;i<=q*p;i++)              printf("%c%d",path[i]/100+'A'-1,path[i]%100);            printf("\n");        }        //if(k != t)          printf("\n");    }    return 0;}


原创粉丝点击