分析:
行列不能重复,对角线不能重复,行列的判断是很简单的,重点是对角线,如果处理不当就会超时。因为我们用dfs可以从1往n推,所以我们可以控制行内只有一个数据。所以我们要处理的两个问题就是列和对角线不能重复。
解法一:
列不重复:
int findlie(int x,int y)
{
for(int i=1;i<=n;i++)
{
if(map[i][y]) return 0;
}
return 1;
}
对角线不重复:
int finddj(int x,int y)
{
//上方递减的对角线
int x1=x-1,y1=y-1;
if(map[x1][y1]) return 0;
while(x1>0&&y1>0){if(map[x1][y1]) return 0;x1--;y1--;}
//上方递增的对角线
x1=x-1,y1=y+1;
if(map[x1][y1]) return 0;
while(x1>0&&y1<=n){if(map[x1][y1]) return 0;x1--;y1++;}
return 1;
}
每判断一个点,就试试这个点的对角线有没有其他点,如果有就pass。因为是从上往下推点,所以只要考虑当前点的上方有无点就可以了。
但是这个方法再数据为13时会超时,所以这个一个87分的解。
分析二:
我们