方格填数

    xiaoxiao2021-03-25  123

    方格填数 如下的10个格子 填入0~9的数字。要求:连续的两个数字不能相邻。 (左右、上下、对角都算相邻) 一共有多少种可能的填数方案? 请填写表示方案数目的整数。 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 注意:在最开始我将设置空格转换为一维数组,我看似觉得思路很正确但是却忽略了对于边界的检验  bool check(int *a,int i)//合理性检查 { if (abs(a[i] - a[i - 1]) <=1)return false;//左边 if (abs(a[i] - a[i - 4]) <= 1) return false;//上边 if (abs(a[i] - a[i - 3]) <= 1) return false;//左上 return true; } 此种算法看似正确但是却忽略了最致命的错误我,由于是一维数组所以我将填充下标从1-10的空格,在下标为4的空格,即第二行第一列的,此时他没有左边,他的左边在代码中显示为空,很显然这是最致命的错误 这是正确的采用一维数组的解析过程,比较暴力 #include<iostream> using namespace std; int a[11], vis[11]; int count1; /*采用先将所有的位置设置好,然后将其进行筛选*/ void DFS(int x) { if (x>10)//所有方格填数完毕    { if (abs(a[1] - a[2])>1 && abs(a[1] - a[4])>1 && abs(a[1] - a[5])>1 && abs(a[1] - a[6])>1 && abs(a[2] - a[3])>1 && abs(a[2] - a[5])>1 && abs(a[2] - a[6])>1 && abs(a[2] - a[7])>1 && abs(a[3] - a[6])>1 && abs(a[3] - a[7])>1 && abs(a[4] - a[5])>1 && abs(a[4] - a[8])>1 && abs(a[4] - a[9])>1 && abs(a[5] - a[6])>1 && abs(a[5] - a[8])>1 && abs(a[5] - a[9])>1 && abs(a[5] - a[10])>1 && abs(a[6] - a[7])>1 && abs(a[6] - a[9])>1 && abs(a[6] - a[10])>1 && abs(a[7] - a[10])>1 && abs(a[8] - a[9])>1 && abs(a[9] - a[10])>1) { /*打印输出每种情况*/ for (int i = 1; i < 11; i++) cout << a[i] << " "; cout << endl; count1++; } } for (int i = 0; i <= 9; i++) if (vis[i] == 0) { vis[i] = 1;//将用过的数标记    a[x] = i;//填数    DFS(x + 1);//对下一个方格继续填数    vis[i] = 0;//清除标记    } } int main() { count1 = 0; DFS(1); cout << count1 << endl; return 0; } 我的想法是采用动态规划,一步一步进行求解,从第一个填空处开始,每赋值一次进行一次合法性判断,如果不满足,切换另一个数值,如果符合则进行递归
    转载请注明原文地址: https://ju.6miu.com/read-26346.html

    最新回复(0)