中级农民
- 积分
- 296
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2013-1-5
- 最后登录
- 1970-1-1
|
第一题- #include <stdio.h>
- #include <stdlib.h>
- #include <string>
- #include <iostream>
- #define N (3)
- using namespace std;
- int visited[N*N] = {0};
- bool can_visit(int i, int j) {
- if (i == j) {
- return false;
- } else if (visited[j-1]) {
- return false;
- }
- //start point
- if (i == 0) {
- return true;
- }
- int rowi = (i-1) / N + 1;
- int coli = (i-1) % N + 1;
- int rowj = (j-1) / N + 1;
- int colj = (j-1) % N + 1;
- if (rowi == rowj) {
- int diff = coli - colj;
- if (diff == 1 || diff == -1) {
- return true;
- } else {
- int k;
- int min = coli > colj ?colj :coli;
- int max = coli > colj ?coli :colj;
- for (k = min+1; k < max; k++) {
- if (!visited[(rowi-1) * N + k - 1]) {
- return false;
- }
- }
- return true;
- }
- } else if (coli == colj) {
- int diff = rowi - rowj;
- if (diff == 1 || diff == -1) {
- return true;
- } else {
- int k;
- int min = rowi > rowj ?rowj :rowi;
- int max = rowi > rowj ?rowi :rowj;
- for (k = min+1; k < max; k++) {
- if (!visited[(k-1) * N + coli - 1]) {
- return false;
- }
- }
- return true;
- }
- } else {
- int diffcol = coli - colj;
- int diffrow = rowi - rowj;
- if (diffcol == diffrow || diffcol == -diffrow) {//diagnal line
- if (diffcol == 1 || diffcol == -1) {//ajacent
- return true;
- }
- int minrow = rowi > rowj ?rowj :rowi;
- int maxrow;
- int startcol;
- int r;
- if (rowi == minrow) {
- startcol = coli;
- maxrow = rowj;
- if (coli < colj) {
- r = 1;
- } else {
- r = -1;
- }
- } else {
- startcol = colj;
- maxrow = rowi;
- if (coli < colj) {
- r = -1;
- } else {
- r = 1;
- }
- }
- int k;
- for (k = minrow+1; k < maxrow; k++) {
- if (!visited[(k-1)*N + startcol + r * (k-minrow)]) {
- return false;
- }
- }
- return true;
- } else {
- return true;
- }
- }
- }
- string int_to_string(int i) {
- char buf[1024];
- snprintf(buf, sizeof(buf), "%d", i);
- return string(buf);
- }
- void back_track_visit(int len, int cur_len, int cur_pos, string path, int &total)
- {
- if (cur_len == len) {
- total++;
- //cout << path << endl;
- return;
- }
- for (int i = 1; i <= N*N; i++) {
- if (!can_visit(cur_pos, i)) {
- continue;
- }
- visited[i-1] = 1;
- back_track_visit(len, cur_len+1, i, path + ">" + int_to_string(i), total);
- visited[i-1] = 0;
- }
- }
- int main(void)
- {
- int total = 0;
- back_track_visit(9, 0, 0, "", total);
- cout << total << endl;
- }
复制代码 |
|