方格填數
如下的10個格仔
+–+–+–+–+
| # | ? | ? | ? |
+–+–+–+–+
| ? | ? | ? | ? |
+–+–+–+–+
| ? | ? | ? | # |
+–+–+–+–+
#:不能填數字;?:需要填寫數字的空格
填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)
一共有多少種可能的填數方案?
請填寫表示方案數目的整數。
注意:你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。
思路:搜尋,把10個空全部填完,然後判斷每乙個數字是否符合要求。
這道題因為需要考慮到上下左右以及對角位置均不可以相鄰,所以需要判斷兩數之間的絕對值,又因為每個數都需要過一遍,所以只用考慮相差為一即可。例如:a = 1, b = 2,對於a而言,b比它大1,因此可以不必考慮對b而言,a比它小1。
另外根據題意,大致我們可以確定需要用到dfs,即深度遍歷,這樣我們才能將所有的情況都過一遍。
**c如下:
#include
#define row 3
#define col 4
//const int row = 3, col = 4; //row行數,col列數
int visit[10]; //數字的使用情況
int flag[row][col]; //格仔填寫標記
int mpt[row][col]; //格仔
int ans = 0;
void init()
for (i = 0; i < row; i++)
}//左上角和右下角不能填寫任何數字
flag[0][0] = 0;
flag[row - 1][col - 1] = 0;
return ;
}void judge()
, , , , , , , };
int i, j, k, x, y;
int valid = 1; //初始化為合法
for (i = 0; i < row; i++)
for (k = 0; k < 8; k++) //檢測
//相鄰即相減後的絕對值為1 判斷當前是否合法
if (mpt[i][j] - mpt[x][y] == 1)}}
}if (valid)
printf("\n");
}printf("\n");
}return ;
}void dfs(int n)
if (flag[x][y]) //如果當前位置可填入數字}}
else
//不可填的時候換下乙個位置
return ;
}int main(int argc, const
char * argv)
over!!! 2016藍橋杯省賽C C A組第三題 方格填數
題意 如下的10個格仔 填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?分析 dfs,劃定邊界,行1 4,列1 3,初始化為int inf,這樣所填入的數字與int inf一定不相鄰,所以可不必單獨考慮 1,1 和 3,4 兩個格仔。includ...
方格填數(2023年藍橋杯)
如圖,如下的10個格仔,填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?請填寫表示方案數目的整數。看到這題第乙個想到的方法就是回溯,就很像八皇后,能填進去就填,填不進去就看下乙個位置 我做的是0 9不重複使用 我感覺這題麻煩就在判斷上 1.首先要...
方格填數,藍橋杯2023年第6題
方格填數 如下的10個格仔 如果顯示有問題,也可以參看 圖1.jpg 填入0 9的數字。要求 連續的兩個數字不能相鄰。左右 上下 對角都算相鄰 一共有多少種可能的填數方案?請填寫表示方案數目的整數。注意 你提交的應該是乙個整數,不要填寫任何多餘的內容或說明性文字。小歧異 不知道0 9 可不可以重複使...