POJ 1321 棋盤問題

2021-06-23 00:57:39 字數 1570 閱讀 2259

題目大意:中文

題目鏈結

注釋**:

/*                               

* problem id : poj 1321 棋盤問題

* author : lirx.t.una

* language : c++

* run time : 16 ms

* run memory : 132 kb

*/ #include #include #include #define maxw 8

int n;//棋盤大小

int cnt;//當前方案數

//下標都是從0開始的

char m[maxw][maxw + 1];//儲存棋盤資訊

bool c[maxw];//col,表示該列是否被占用過

void

dfs( int r, int lft )

if ( r >= n ) return ;//搜尋超出棋盤範圍直接退出

for ( i = 0; i < n; i++ )//搜尋當前行的每一列

if ( '#' == m[r][i] && !c[i] )

//!!!如果k < n,可能出現中間空出幾行不用的情況

//以上的搜尋的含義是如果r行有位置可以擺就搜尋,如果沒位置擺就無解

//不考慮是否跳過改行試一下下面的行

//因此需要再試一下改行跳到下一行搜尋

//其中,如果剩餘行和剩餘棋子數超過寬度則無需再跳,最後必然會跳出棋盤之外,這是重要的剪枝!!

if ( lft + r < n ) dfs( r + 1, lft );

}int

main()

cnt = 0;

dfs( 0, k );//初始時從0行開始搜,剩餘棋子是k個

printf("%d\n", cnt);

} return 0;

}

無注釋**:

#include #include #include #define	maxw	8

int n;

int cnt;

char m[maxw][maxw + 1];

bool c[maxw];

void

dfs( int r, int lft )

if ( r >= n ) return ;

for ( i = 0; i < n; i++ )

if ( '#' == m[r][i] && !c[i] )

if ( lft + r < n ) dfs( r + 1, lft );

}int

main()

cnt = 0;

dfs( 0, k );

printf("%d\n", cnt);

} return 0;

}

POJ 1321 棋盤問題

time limit 1000ms memory limit 10000k total submissions 7007 accepted 3390 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一行或者同一列...

poj 1321 棋盤問題

棋盤問題 time limit 1000ms memory limit 10000k total submissions 15365 accepted 7600 description 在乙個給定形狀的棋盤 形狀可能是不規則的 上面擺放棋子,棋子沒有區別。要求擺放時任意的兩個棋子不能放在棋盤中的同一...

POJ 1321 棋盤問題

找到第乙個有 的行開始回溯就可以了 include include using namespace std const int maxn 9 char board maxn maxn bool c maxn int ans,n,k void backtracking int curi,int cnt...