日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

poj1321 DFS

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj1321 DFS 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

棋盤問題

Time Limit: 1000 MS Memory Limit: 10000 KB

64-bit integer IO format: %I64d , %I64u Java class name: Main

[Submit] [Status] [Discuss]

Description

在一個給定形狀的棋盤(形狀可能是不規則的)上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列,請編程求解對于給定形狀和大小的棋盤,擺放k個棋子的所有可行的擺放方案C。

Input

輸入含有多組測試數據。
每組數據的第一行是兩個正整數,n k,用一個空格隔開,表示了將在一個n*n的矩陣內描述棋盤,以及擺放棋子的數目。 n <= 8 , k <= n
當為-1 -1時表示輸入結束。
隨后的n行描述了棋盤的形狀:每行有n個字符,其中 # 表示棋盤區域, . 表示空白區域(數據保證不出現多余的空白行或者空白列)。

Output

對于每一組數據,給出一行輸出,輸出擺放的方案數目C (數據保證C<2^31)。

Sample Input

2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1

Sample Output

2 1

#include<iostream> #include <string.h> using namespace std;bool chess[9][9]; bool vist_col[9]; //列標記 int status; //狀態計數器 int n,k;void DFS(int row,int num) //逐行搜索,row為當前搜索行,num為已填充的棋子數 {if(num==k){status++;return;}if(row>n) //配合下面DFS(row+1,num); 語句使用,避免搜索越界return;for(int j=1; j<=n; j++){if(chess[row][j] && !vist_col[j]){vist_col[j]=true; //放置棋子的列標記DFS(row+1,num+1);vist_col[j]=false; //回溯后,說明擺好棋子的狀態已記錄,當前的列標記還原 }}DFS(row+1,num); //這里是難點,當k<n時,row在等于n之前就可能已經把全部棋子放好//又由于當全部棋子都放好后的某個棋盤狀態已經在前面循環時記錄了//因此為了處理多余行,令當前位置先不放棋子,搜索在下一行放棋子的情況return; }int main(int i,int j) {while(cin>>n>>k){if(n==-1 && k==-1)break;/*Initial*/memset(chess,false,sizeof(chess));memset(vist_col,false,sizeof(vist_col));status=0;for(i=1; i<=n; i++)for(j=1; j<=n; j++){char temp;cin>>temp;if(temp=='#')chess[i][j]=true;}DFS(1,0); //注意初始化的值別弄錯了cout<<status<<endl;}return 0; }

題意:? 難得的漢字題面

這個錯在哪里了呢

#include <iostream>#include <stdio.h>#include <string.h>using namespace std;bool map[9][9];bool vis[9];int n,k;int sum;void dfs(int row,int num){if(num==k){sum++;return;}if(row>n)return;for(int i=1;i<=n;i++){if(map[row][i]==true&&vis[i]==false){vis[i]=true;dfs(row+1,num+1);vis[i]==false;}}dfs(row+1,num);return;}int main(){while(cin>>n>>k){if(n==-1&&k==-1)break;memset(vis,false,sizeof(vis));sum=0;memset(map,false,sizeof(map));for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){char str;cin>>str;if(str=='#')map[i][j]=true;}}dfs(1,0);cout<<sum<<endl;}return 0;}

?

轉載于:https://www.cnblogs.com/zhangying/p/3860435.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的poj1321 DFS的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。