Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 36767 | Accepted: 12489 |
Description
Input
Output
Sample Input
3 1 1 2 3 4 3
Sample Output
Scenario #1: A1 Scenario #2: impossible Scenario #3: A1B3C1A2B4C2A3B1C3A4B2C4
题意:马要走完所有的点,可以给出路径,否则impossible
这道题做的血槽已空,20分钟就敲完了,然后就在卡数据,卡的最后一个样例后面的老是不对,之后才发现要按照字典序输出,所以gx,gy就不能乱走,改完之后输出对了,还是wrong answer,郁闷,检查提交wa,在提交wa,一度怀疑judge出问题了,今天早上又看了一遍,发现gx,gy,将x,y弄得反了,真是晕死了,晕的死死了,白白贡献这么多的wa;
棋盘横着的是A...Z,竖着的是1234...输出先输出y,再输出x
#include
#include
#include
#include
#include
#include
using namespace std;
const int MAX = 30;
struct Node
{
int x,y;
};
Node node[MAX*MAX];
int vis[MAX][MAX];
int p,q,flag;
int gx[8] = {-1,1,-2,2,-2,2,-1,1};
int gy[8] = {-2,-2,-1,-1,1,1,2,2};
void dfs(int x,int y,int cnt)
{
if(cnt == p*q)
{
flag = 1;
for(int i = 0; i < p*q; i++)
printf("%c%d",node[i].y + 'A',node[i].x + 1);
printf("\n");
return;
}
if(flag) return;
for(int i = 0; i < 8; i++)
{
int fx = x + gx[i];
int fy = y + gy[i];
if(fx >= 0 && fy >= 0 && fx < p && fy < q)
{
if(vis[fx][fy] == 0)
{
vis[fx][fy] = 1;
node[cnt].x = fx;
node[cnt].y = fy;
dfs(fx,fy,cnt + 1);
if(flag)
return;
vis[fx][fy] = 0;
}
}
}
}
int main()
{
int t,num = 0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&p,&q);
flag = 0;
printf("Scenario #%d:\n",++num);
for(int i = 0; i < p; i++)
{
for(int j = 0; j < q; j++)
{
if(flag)
break;
memset(vis,0,sizeof(vis));
node[0].x = i;
node[0].y = j;
vis[i][j] = 1;
dfs(i,j,1);
}
if(flag)
break;
}
if(flag == 0)
printf("impossible\n");
printf("\n");
}
return 0;
}