题目链接: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;
}