大爆搜,就是读入的时候比较麻烦,但我写的还是比较清楚的
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int id[10][10]=
{
{0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,1,1,1,2,2,2,3,3,3},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,4,4,4,5,5,5,6,6,6},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9},
{0,7,7,7,8,8,8,9,9,9}
};
int f[10][10][10][10],a[10][10];
int vis1[10][10],vis2[10][10],vis3[10][10];
void dfs(int x,int y)
{
if (x==10)
{
for (int i=1;i<=9;i++)
{
for (int k=1;k<=9;k++)
cout<<a[i][k]<<" ";puts("");
}
exit(0);
}
int i;
for (int i=1;i<=9;i++)
{
if (f[x][y][x][y-1]==2&&i<=a[x][y-1]) continue;
if (f[x][y][x][y-1]==1&&i>=a[x][y-1]) continue;
if (f[x][y][x-1][y]==2&&i>=a[x-1][y]) continue;
if (f[x][y][x-1][y]==1&&i<=a[x-1][y]) continue;
if (vis1[x][i]||vis2[y][i]||vis3[id[x][y]][i]) continue;
a[x][y]=i;vis1[x][i]=vis2[y][i]=vis3[id[x][y]][i]=1;
if (y==9) dfs(x+1,1);
else dfs(x,y+1);
a[x][y]=0;vis1[x][i]=vis2[y][i]=vis3[id[x][y]][i]=0;
}
return ;
}
int main()
{
for (int i=1;i<=3;i++)
for (int k=1;k<=5;k++)
{
if (k&1)
{
int h=(i-1)*3+k/2+1,l=2;
for (int j=1;j<=3;j++)
{
char s[100];scanf("%s",s);
f[h][l][h][l-1]=(s[0]=='<'?2:1);
scanf("%s",s);
f[h][l+1][h][l]=(s[0]=='<'?2:1);
l+=3;
}
}
else
{
int h=(i-1)*3+k/2;
for (int j=1;j<=9;j++)
{
char s[100];scanf("%s",s);
f[h+1][j][h][j]=(s[0]=='v'?2:1);
}
}
}
dfs(1,1);
return 0;
}