一筆畫問題是在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 分別表示這個畫中...