2015-09-14 54 views
-2

背景信息:我正在編寫一個C++程序來解決數獨謎題,並且我碰到了一個主要障礙。程序的一般流程是這樣的:字符/ int相等性評估不正確

  • 遍歷網格,並檢查是否可以用數字替換0。 (空格用0表示)
  • 檢入3個維度(垂直,水平和框中)哪些數字已經存在。
  • 確定我們是否可以將該數字縮小到一種可能性,替換它,然後繼續。
  • 重複,直到電網沒有零點

我遇到的問題,在第二階段,我會在底部後整個程序,但在這裏只有相關的代碼。

int* check_v(string g, size_t x, size_t y){ 
    int *ans = new int[9]; //array of possible ints 
    memset(ans, 0, sizeof(ans)); //set array to all 0s 
    size_t size = 0; 
    for(int i = 1; i < 10; i++){ //iterate through 1-10 
    //check if i is in the col, if it isn't then add i to ans 
    bool placeable = true; 
    for(size_t j = 0; j < 9; j++){ //iterate through ints in the col 
     size_t r = (j + x) % 9; //the string is a 9x9 grid of numbers 
     cout << get(g,r,y) << " == " << i << " is " << (get(g,r,y) - 0 == i - 0); 
     //this is my debug statement, because the if below isn't working. 
     if(get(g,r,y) - 0 == i - 0){ //if i is equal to a num in the grid, 
     placeable = false;//we know it can't be that number 
     } 
    } 
    if(placeable) ans[size++] = i; //only add i if we didn't find it in the grid 
    } 
    return ans; 
} 

這是爲每個數字檢查列以查看哪些數字尚未存在的方法之一。

下面是相關的get()方法:

char get(string g, size_t x, size_t y){ 
    return g.at(x * 9 + y); 
} 

其中G是一串數字0-9 81個字母。這是一個9x9的網格,但放入一個長串。

所以get(g,r,y)返回一個像'6'這樣的字符,而我是一個int。我做'6' - 0使他們​​都ints,並比較它們。但是,它總是錯誤的!即使當我= 6並得到(g,r,y)='6'。我在做我的比較錯誤嗎?我必須在某個地方有一個錯字,而我只是看不到它。以下是該cout調用的一些示例輸出,並且我將發佈整個文件以獲取上下文。

//output 
0 == 1 is 0 
3 == 1 is 0 
8 == 1 is 0 
2 == 1 is 0 
5 == 1 is 0 
7 == 1 is 0 
4 == 1 is 0 
9 == 1 is 0 
6 == 1 is 0 //this is all right, there aren't any 1s in the col 
0 == 2 is 0 
3 == 2 is 0 
8 == 2 is 0 
2 == 2 is 0 //but this is wrong! why isn't this true? 
5 == 2 is 0 
7 == 2 is 0 
4 == 2 is 0 
9 == 2 is 0 
6 == 2 is 0 

現在這裏是整個文件給你的全部圖片。

using namespace std; 
#include <iostream> 
#include <cstring> 

void print(string g){ 
    for(size_t i = 0; i < 9; i++){ 
     for(size_t j = 0; j < 9; j++){ 
      cout << g.at(i * 9 + j); 
     } 
     cout << endl; 
    } 
} 
void set(string & g, size_t x, size_t y, char z){ 
    size_t i = x * 9 + y; 
    string beg = g.substr(0,i); 
    string end = g.substr(i+1,g.length()); 
    g = beg + z + end; 
} 
char get(string g, size_t x, size_t y){ 
    return g.at(x * 9 + y); 
} 
int* check_v(string g, size_t x, size_t y){ 
    int *ans = new int[9]; 
    memset(ans, 0, sizeof(ans)); 
    size_t size = 0; 
    for(int i = 1; i < 10; i++){ 
     bool placeable = true; 
     for(size_t j = 0; j < 9; j++){ 
      size_t r = (j + x) % 9; 
      cout << get(g,r,y) << " == " << i << " is " << (get(g,r,y) - 0 == i - 0) << endl; 
      if(get(g,r,y) - 0 == i - 0){ 
       placeable = false; 
      } 
     } 
     if(placeable) ans[size++] = i; 

    } 
    return ans; 
} 
int* check_b(string g, size_t x, size_t y){ 
    int *ans = new int[9]; 
    memset(ans, 0, sizeof(ans)); 
    size_t size = 0; 
    x = x/3 * 3; 
    y = y/3 * 3; 
    for(size_t i = 0; i < 3; i++){ 
     bool placeable = true; 
     for(size_t j = 0; j < 3; j++) 
      if(get(g,x + i, y + j) == static_cast<char>(i)) 
       placeable = false; 
     if(placeable) ans[size++] = i; 
    } 
    return ans; 
} 
int* check_h(string g, size_t x, size_t y){ 
    int *ans = new int[9]; 
    memset(ans, 0, sizeof(ans)); 
    size_t size; 
    for(size_t i = 1; i < 10; i++){ 
     bool placeable = true; 
     for(size_t j = 0; j < 9; j++){ 
      cout << get(g,x,(j + y) % 9) << " == " << i << endl; 
      if(get(g,x,(y + j) % 9) == static_cast<char>(i)){ 
       placeable = false; 
      } 
     } 
     if(placeable) ans[size++] = i; 
    } 
    return ans; 
} 
void check(string g, size_t x, size_t y){ 
    int *n_v = check_v(g, x, y); 
    int *n_h = check_h(g, x, y); 
    int *n_b = check_b(g, x, y); 
    int n_y[9] = {0}; 
    int n; 
    size_t size = 0; 

    cout << "vert: "; 
    for (int i = 0; i < 9; i++) 
      cout << n_v[i]; 
    cout << endl << "hor: "; 
    for (int i = 0; i < 9; i++) 
      cout << n_h[i]; 
    cout << endl << "box: "; 
    for (int i = 0; i < 9; i++) 
      cout << n_b[i]; 
    cout << endl; 

    if(n_v[0] == 0 || n_h[0] == 0 || n_b[0] == 0) 
     cout << "Error, no number works in slot " << x << ", " << y << endl; 
    else{ 
     if(n_v[1] == 0) 
      n = n_v[0]; 
     else if(n_h[1] == 0) 
      n = n_h[0]; 
     else if(n_b[1] == 0) 
      n = n_b[0]; 
    } 

    for(size_t i = 0; i < 9; i++){ 
     bool possible = true; 
     for(size_t j = 0; possible && j < 9; j++){ 
      if(n_h[j] != n_v[i]) 
       possible = false; 
     } 
     for(size_t j = 0; possible && j < 9; j++){ 
      if(n_b[j] != n_v[i]) 
       possible = false; 
     } 
     if(possible) 
      n_y[size++] = n_v[i]; 
    } 
    if(n_y[1] == 0) 
     n = n_y[0]; 

    if(n != 0){ 
     char c = n; 
     set(g,x,y,c); 
    } 
} 

int main(){ 
    //initializations 
    size_t dim = 9; 
    string data = ""; 
    string one_row; 
    for (size_t r = 0; r < dim ; r = r + 1) { 
    cin >> one_row; 
    data += one_row; 
    } 

    //start solving 
    bool cont = true; 
    while(cont){ 
     cont = false; 
     for(size_t i = 0; i < data.length(); i ++){ 
      if(data.at(i) == '0'){ 
       cont = true; 
       cout << "Checking at point " << i/9 << ", " << i % 9 << endl; 
       string old = data; 
       check(data, i/9, i % 9); 
       if(old.compare(data) != 0) 
        print(data); 
      } 
     } 
    } 
    print(data); 
} 
+1

''6'根本不等於'6'。也許你想'get(g,r,y) - '0'== i'。在ASCII中,「0」的值是48,而不是0。 – paddy

+0

'int * ans = new int [9];'只是沒有。你甚至不刪除它。至少使用'int ans [9] = {};' –

+0

注意:如果您在調試時執行了轉換操作:'cout <<(int)get(g,r,y)',您將會發現此問題。 'char'的流輸出操作符被重載,所以它輸出一個字符而不是實際的值。 – paddy

回答

1

此:

if(get(g,r,y) - 0 == i - 0) 

不工作。如果get返回一個字符,則它是表示該數字的CODE的字符串中的字符。你從中減去一個整數0,它不會減去任何東西。你想要的是要麼

if(get(g,r,y) - '0' == i) 

或者

if(get(g,r,y) == i + '0') 

它假定ASCII(不是Unicode或別的東西)。

你試圖做的是在ascii CHARACTER和一個整數之間進行「轉換」。您可以將其轉換爲其中一種,而不是兩種。 0和'0'之間的差異是第一個是整數零,第二個是字符0,就像在字符串中找到的那樣。

+0

謝謝!我誤解了另一篇文章的答案,這是我得到的信息減去0.我知道這是一個錯字 – DrewDiezel

0
(get(g,r,y) - 0 == i - 0); 

這是錯誤的。改用它。

(get(g,r,y) - '0' == i - 0); 
+0

謝謝!這是正確的,雖然給出的其他答案提供了更多的信息爲什麼,所以我將其標記爲正確。 – DrewDiezel