征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
生活随笔
收集整理的這篇文章主要介紹了
征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
如下的10個格子
(如果顯示有問題,也可以參看【圖7-1.jpg】)
填入0~9的數字。要求:連續的兩個數字不能相鄰。
(左右、上下、對角都算相鄰)
一共有多少種可能的填數方案?
請填寫表示方案數目的整數。
注意:你提交的應該是一個整數,不要填寫任何多余的內容或說明性文字。
代碼
#include <iostream> #include <stdlib.h>using namespace std;int a[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int ans;bool check(){if(abs(a[0]-a[1])==1||abs(a[0]-a[3])==1||abs(a[0]-a[4])==1||abs(a[0]-a[5])==1||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[5])==1||abs(a[2]-a[6])==1||abs(a[3]-a[4])==1||abs(a[3]-a[7])==1||abs(a[3]-a[8])==1||abs(a[4]-a[5])==1||abs(a[4]-a[7])==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[6]-a[9])==1||abs(a[7]-a[8])==1||abs(a[8]-a[9])==1)return false;return true; }/*考慮第k個位置,一般從0開始*/ void f(int k) { //出口if (k == 10) {bool b = check();if(b)ans++;return;}for (int i = k; i < 10; ++i) {//嘗試將位置i與位置k交換,以此確定k位的值{int t = a[i];a[i] = a[k];a[k] = t;}f(k + 1); // 回溯{int t = a[i];a[i] = a[k];a[k] = t;}} }int main(int argc, const char *argv[]) {f(0);cout << ans << endl;return 0; } #include <iostream>using namespace std;int a[5][6]; int vis[10]; int ans;bool check(int i,int j) {for (int x = i - 1; x <= i + 1; ++x) {for (int y = j - 1; y <= j + 1; ++y) {if (abs(a[x][y] - a[i][j]) == 1)return false;}}return true; }void f(int x, int y) {if (x == 3 && y == 4) {ans++;return;} // 從0~9中抓一個for (int i = 0; i < 10; ++i) {if (vis[i] == 0) {//i沒有被用過a[x][y] = i;//填數if(!check(x,y)){//不合法,恢復并continuea[x][y]=-10;continue;}vis[i] = 1;//標記為已訪問if (y == 4)f(x + 1, 1);//換行elsef(x, y + 1);//繼續填右側的格子{vis[i] = 0;//回溯a[x][y]=-10;}}}}void init() {for (int i = 0; i < 5; ++i) {for (int j = 0; j < 6; ++j) {a[i][j] = -10;}} }int main(int argc, const char *argv[]) {init();f(1, 2);cout << ans << endl;return 0; }總結
以上是生活随笔為你收集整理的征战蓝桥 —— 2016年第七届 —— C/C++A组第3题——方格填数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 征战蓝桥 —— 2016年第七届 ——
- 下一篇: 征战蓝桥 —— 2016年第七届 ——