| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
本人菜鸟为啥一直WA#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
int y[8]={-2,-2,-1,-1,1,1,2,2};
int x[8]={-1,1,-2,2,-2,2,-1,1};
int a[9][9]={0};//棋盘用于记录每个位置是否都被遍历过
int path[26]={0};//记录路径的选择
queue <int > q_queue;
queue <int > p_queue;
bool all_done(int p,int q);//判断是否全部遍历
int main()
{
int n,p,q;//n cases
int i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("\n");
scanf("%d%d",&p,&q);
q_queue.push(q);
p_queue.push(p);
}
for(i=n;i>0;i--)
{
q=q_queue.front();
q_queue.pop();
p=p_queue.front();
p_queue.pop();
memset(a,0,sizeof(a));
memset(path,0,sizeof(path));
int curr_x,curr_y;
curr_x=1;//记录初始位置
curr_y=1;
a[curr_x][curr_y]=1;
for(j=1;j<p*q;j++)//对于p*q的表格要全遍历完成需行走p*q-1次
{
for(k=path[j];k<8;k++)//对于每一步行走的试探
{
if(curr_x+x[k]<=p&&curr_y+y[k]<=q
&&curr_x+x[k]>=1&&curr_y+y[k]>=1
&&a[curr_x+x[k]][curr_y+y[k]]!=1)//判断是否超界
{
curr_x=curr_x+x[k];//未超界向下走一步
curr_y+=y[k];
path[j]=k;//记录当前所走路径
a[curr_x][curr_y]=1;//标记相应单元格
break;//跳过此步
}
}
if(k==8)//此时证明已经无法继续走应该回退到上一步
{
path[j]=0;//清空当前步
j=j-1;//回退一步
a[curr_x][curr_y]=0;//清空当前标记
curr_x-=x[path[j]];
curr_y-=y[path[j]];
path[j]++;
j=j-1;
}
if(j<0)
{
break;
}
}
if(all_done(p,q))
{
curr_x=1;
curr_y=1;
printf("Scenario #%d:\n",n-i+1);
printf("%c%d",('A'+curr_x-1),curr_y);
for(int k=1;k<p*q;k++)
{
curr_x=curr_x+x[path[k]];
curr_y=curr_y+y[path[k]];
printf("%c%d",('A'+curr_x-1),curr_y);
}
printf("\n");
}
else
{
printf("Scenario #%d:\n",n-i+1);
printf("impossible\n");
}
}
return 0;
}
bool all_done(int p,int q)
{
int i,j;
for(i=1;i<=p;i++)
{
for(j=1;j<=q;j++)
{
if(a[i][j]==0)
return false;
}
}
return true;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator