又是一道dfs的题目。开始分析题目发现是一道求Graph通路的问题,开始思考用邻接表或矩阵建图,然后通路判断+遍历;后来看分析发现忽略了“字典序排列”,所以需要从A1开始按一定顺序搜索,而且采用dfs算法。代码如下:
#include<iostream>
#include<string>
#include<iomanip>
#include<cstdlib>
#include<string.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<malloc.h>
using namespace std;
int add[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
int p,q;
int visit[27][27]={0};
int n;
struct Excl
{
int con;
int len;
};
stack<Excl> lst;
int dfs(int i,int j,int b)
{
int m=0,sum=0;
Excl md;
visit[i][j]=1;
md.len=i;md.con=j;
lst.push(md);
if(b==p*q)
return b;
else
{
if((i+add[0][0])>=0&&(i+add[0][0])<q&&(j+add[0][1])>=0&&(j+add[0][1])<p)
{
if(!visit[i+add[0][0]][j+add[0][1]])
sum=dfs(i+add[0][0],j+add[0][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[1][0])>=0&&(i+add[1][0])<q&&(j+add[1][1])>=0&&(j+add[1][1])<p)
{
if(!visit[i+add[1][0]][j+add[1][1]])
sum=dfs(i+add[1][0],j+add[1][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[2][0])>=0&&(i+add[2][0])<q&&(j+add[2][1])>=0&&(j+add[2][1])<p)
{
if(!visit[i+add[2][0]][j+add[2][1]])
sum=dfs(i+add[2][0],j+add[2][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[3][0])>=0&&(i+add[3][0])<q&&(j+add[3][1])>=0&&(j+add[3][1])<p)
{
if(!visit[i+add[3][0]][j+add[3][1]])
sum=dfs(i+add[3][0],j+add[3][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[4][0])>=0&&(i+add[4][0])<q&&(j+add[4][1])>=0&&(j+add[4][1])<p)
{
if(!visit[i+add[4][0]][j+add[4][1]])
sum=dfs(i+add[4][0],j+add[4][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[5][0])>=0&&(i+add[5][0])<q&&(j+add[5][1])>=0&&(j+add[5][1])<p)
{
if(!visit[i+add[5][0]][j+add[5][1]])
sum=dfs(i+add[5][0],j+add[5][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[6][0])>=0&&(i+add[6][0])<q&&(j+add[6][1])>=0&&(j+add[6][1])<p)
{
if(!visit[i+add[6][0]][j+add[6][1]])
sum=dfs(i+add[6][0],j+add[6][1],b+1);
if(sum==p*q)
return sum;
}
if((i+add[7][0])>=0&&(i+add[7][0])<q&&(j+add[7][1])>=0&&(j+add[7][1])<p)
{
if(!visit[i+add[7][0]][j+add[7][1]])
sum=dfs(i+add[7][0],j+add[7][1],b+1);
if(sum==p*q)
return sum;
}
visit[i][j]=0;
lst.pop();
}
return b;
/*while(m<8) 这种算法有错误
{
if((i+add[m][0])>=0&&(i+add[m][0])<q&&(j+add[m][1])>=0&&(j+add[m][1])<p)
{
if(!visit[i+add[m][0]][j+add[m][1]])
{
Excl md;md.len=i+add[m][0];md.con=j+add[m][1];
lst.push(md);
visit[i+add[m][0]][j+add[m][1]]=1;
sum++;
dfs(i+add[m][0],j+add[m][1],b+1);
if(b!=p*q)
{
sum--;
visit[i+add[m][0]][j+add[m][1]]=0;lst.pop();
}
}
}
if(b==p*q)
return 1;
else if(m==7&&sum==0)
{
lst.pop();
visit[i][j]=0;
return 0;
}
m++;
}
visit[i][j]=0;
return 0;*/
}
int main()
{
int i,j,pre=0;
Excl md;
stack <Excl> fin;
cin>>n;
while(pre<n)
{
cin>>q>>p;
memset(visit,0,sizeof(visit));
dfs(0,0,1);
for(i=0;i<q;i++)
for(j=0;j<p;j++)
{
if(!visit[i][j])
{
cout<<"Scenario #"<<pre+1<<":"<<endl<<"impossible\n\n";
while(lst.size())
lst.pop();
goto L1;
}
}
cout<<"Scenario #"<<pre+1<<":"<<endl;
while(lst.size())
{
md=lst.top();
fin.push(md);
lst.pop();
}
while(fin.size())
{
md=fin.top();
fin.pop();
printf("%c%d",'A'+md.con,md.len+1);
}
cout<<endl<<endl;
L1: pre++;
}
return 0;
}