一筆畫問題

2021-06-02 19:46:42 字數 3439 閱讀 3811

一筆畫問題是在6x6的棋盤上分布著若干點,從紅色起點開始依次不重複地經過每個白色點,已經經過的點可以跨越過去。

程式採用深度搜尋,從紅色點開始分別往上、往下、往左和往右邁出第一步,然後沿著當前方向,分別探測左邊、前面和右邊的下一結點,標記已經經過的節點為空。

探測到左邊有節點就左轉,然後直行到該節點;如果探測到前面有節點,就直行到該節點;如果探測到右邊有節點則右轉,然後直行到該節點;三個方向都探測完畢,則返回父節點。

如果當前深度遍歷完所有節點,則輸出當前的搜尋樹路徑。

#include #include #include enum

;char map[36] =

"o oo o"

" o o "

"o xo o"

"o oo o"

" o o "

"o oooo"; /*

"oo xo "

" oo oo"

"oooo o"

"o oo o"

" o "

"o o o "

"o o o"

"oo o o"

" o oo"

" oo o"

" o xo "

"o o o"

" o o o"

"o oo "

"o o oo"

" oxo o"

"o o o"

"o o o"

*/int mapnodes;

struct

stack[36];

int stacktop;

int initnode(void);

void pushnode(int pos, int dir);

void popnode(void);

int remotenode(int pos, int dir);

void goleft(int pos, int dir);

void goright(int pos, int dir);

void goforward(int pos, int dir);

void printpath(void);

void findnode(int pos, int dir);

void findpath(void);

int main()

int initnode()

} return pos;

}void pushnode(int pos, int dir)

void popnode()

int remotenode(int pos, int dir)

do } while(1);

return node;

}void goleft(int pos, int dir)

while(0);

}void goright(int pos, int dir)

while(0);

}void goforward(int pos, int dir)

while(0);

}void findnode(int pos, int dir)

else

popnode();

}void findpath()

}void printpath()

path[row2][col2] = 'o';

doelse if(path[row][col] == '-' && road == '|')

else if(path[row][col] == '|' && road == '-')

else if(path[row][col] == '|' && road == '|')

else if(path[row][col] == '-' && road == '-')

} while((row != row2) || (col != col2));

} if(nooverlap)

printf("\n");

for(row = 0; row < 11; row ++)

}printf("\n");

} printf("\n");

}}

下面是程式搜尋結果的開頭的幾個:

path:2,2->2,3->2,5->0,5->0,3->3,3->5,3->5,2->5,0->3,0->2,0->0,0->0,2->3,2->3,5->5,5->5,4->4,4->1,4->1,1->4,1

o-------o o-------o

| | | |

| o---+---+---o |

| | | | | |

o | x---o---+---o

| | | | |

o | o---o---+---o

| | | | |

| o | o |

| | | |

o-------o---o o---o

path:2,2->2,3->2,5->0,5->0,3->3,3->5,3->5,2->5,0->3,0->2,0->0,0->0,2->3,2->3,5->5,5->5,4->4,4->4,1->1,1->1,4

o-------o o-------o

| | | |

| o---+---+---o |

| | | | |

o | x---o-------o

| | | |

o | o---o-------o

| | | |

| o-------+---o |

| | | |

o-------o---o o---o

path:2,2->0,2->0,0->2,0->2,3->2,5->0,5->0,3->3,3->5,3->5,2->5,0->3,0->3,2->3,5->5,5->5,4->4,4->1,4->1,1->4,1

o-------o o-------o

| | | |

| o---+---+---o |

| | | | | |

o---+---x---o---+---o

| | |

o---+---o---o---+---o

| | | | |

| o | o |

| | | |

o-------o---o o---o

一筆畫問題

描述 判斷乙個圖是否能夠用一筆畫下來.規定,所有的邊都只能畫一次,不能重複畫。輸入第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一行有兩個正整數p,q p 1000,q 2000 分別表示這個畫中有多少個頂點和多少條連線。點的編號從1到p 隨後的q行,每行有兩個正整數a,b ...

一筆畫問題

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入 第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一...

一筆畫問題

描述 zyc從小就比較喜歡玩一些小遊戲,其中就包括畫一筆畫,他想請你幫他寫乙個程式,判斷乙個圖是否能夠用一筆畫下來。規定,所有的邊都只能畫一次,不能重複畫。輸入 第一行只有乙個正整數n n 10 表示測試資料的組數。每組測試資料的第一行有兩個正整數p,q p 1000,q 2000 分別表示這個畫中...