两个DFS()~~~
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
char map[10][10];
int xx[4]={0,1,0,-1};
int yy[4]={1,0,-1,0};
struct node
{
int x,y;
int dir;
};
node res[10000];
void fling(int x,int y,int i)
{
int nx=x+xx[i];
int ny=y+yy[i];
int flag=0;
if(nx<0||nx>=7||ny<0||ny>=8)
{
map[x][y]='X';
return ;
}
while(map[nx][ny]=='X')
{
nx=nx+xx[i];
ny=ny+yy[i];
if(nx<0||nx>=7||ny<0||ny>=8)
{
flag=1;
break;
}
}
if(flag)
{
map[x][y]='X';
return ;
}
map[x][y]='X';
map[nx-xx[i]][ny-yy[i]]='O';
fling(nx,ny,i);
return ;
}
int dfs(int sum,int k)
{
if(sum==1)
{
return 1;
}
char t_map[10][10];
memcpy(t_map,map,sizeof(map));
int x,y;
for(x=0;x<7;x++)
{
for(y=0;y<8;y++)
{
if(map[x][y]=='X')
continue;
int i;
for(i=0;i<4;i++)
{
int nx=x+xx[i];
int ny=y+yy[i];
if(nx<0||nx>=7||ny<0||ny>=8)
continue;
if(map[nx][ny]=='O')
continue;
int flag=0;
while(map[nx][ny]=='X')
{
nx=nx+xx[i];
ny=ny+yy[i];
if(nx<0||nx>=7||ny<0||ny>=8)
{
flag=1;
break;
}
}
if(flag)
continue;
map[x][y]='X';
map[nx-xx[i]][ny-yy[i]]='O';
fling(nx,ny,i);
res[k].x=x;
res[k].y=y;
res[k].dir=i;
if(dfs(sum-1,k+1))
return 1;
memcpy(map,t_map,sizeof(t_map));
}
}
}
return 0;
}
int main()
{
char temp[10];
int cas=0;
while(scanf("%s",temp)!=EOF)
{
cas++;
int i,j;
for(i=0;i<8;i++)
map[0][i]=temp[i];
for(i=1;i<7;i++)
scanf("%s",map[i]);
int sum=0;
for(i=0;i<7;i++)
{
for(j=0;j<8;j++)
{
if(map[i][j]=='O')
sum++;
}
}
memset(res,-1,sizeof(res));
dfs(sum,0);
if(cas!=1)
printf("\n");
printf("CASE #%d:\n",cas);
for(i=0;res[i].dir!=-1;i++)
{
char c;
if(res[i].dir==0)
c='R';
else if(res[i].dir==1)
c='D';
else if(res[i].dir==2)
c='L';
else if(res[i].dir==3)
c='U';
printf("%d %d %c\n",res[i].x,res[i].y,c);
}
}
return 0;
}