这道题目是一个DFS题目
要注意搜索的方向,因为要保证结果是搜出一个符合条件的正方形
所以,可以 从第一行 按列搜索,再换行,一直到 row+1 行的时候,跳出循环
// 我是 从 r=0,c=0开始的,所以r=n-1,c=n-1是最右下角
//已经压缩过了的
bool dfs(int r,int c)
{
if(r==n) //跳出
return true;
for(int i=0;i<dif;i++)
{
if(map[i].count)
if((r==0||map[i].up==map[coord[r-1][c]].down)&&(c==0||map[i].left==map[coord[r][c-1]].right)) //符合条件
{
coord[r][c]=i; // 第r+1行,c+1列 是 第i个小正方形
map[i].count--; //第i个小正方形数目减去1
if(c==n-1) //到最右边了
{
if(dfs(r+1,0)) //换行搜索
return true;
}
else
if(dfs(r,c+1)) //不换行,按列搜索
return true;
map[i].count++;
}
}
return false;
}
干脆贴出代码吧
代码还有许多可以优化的地方,比如在dfs里面的那个for(i=0;i<dif;i++)
我可以先建立一个临界表.....
就会避免许多不必要的搜索时间了