Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
先后进行1次强剪枝和2次优化之后,从原来的300MS变成80MS,请教牛人们0MS的实现方法.可否帮我将下面的代码由80MS改成0MS.感激不尽#include <iostream> using namespace std; const int N = 8; char chess[N][N];// 棋盘 int n; int k; // 棋子总数 int sum; // 已经下的棋子个数 int C; // 总的方案 bool colFlag[8]; // 标记某列是否可放棋子,TRUE时表示可放 bool Place(char chess[N][N], int i, int j) { // int row; // int col; // (第1次优化)注释掉第一个for语句后,只判断同一列,不再用判断同一行,从原来的200MS减少为100MS, // for (col=0; col<=j-1; col++) // { // if (chess[i][col] == '+') // { // return false; // } // } // (第2次优化)继续注释掉第二个for语句后,列的判断改用数组来标记,由原来的100MS减少为80MS // for (row=0; row<=i-1; row++) // { // if (chess[row][j] == '+') // { // return false; // } // } return colFlag[j]; } void DFS(char chess[N][N], int i, int j) { if (j == n) { i++; j = 0; } if (i == n) { return ; } if (chess[i][j] == '.') { DFS(chess, i, j+1); } else /*if (chess[i][j] == '#')*/ { DFS(chess, i, j+1); if (Place(chess, i, j)) { sum++; colFlag[j] = false; if (sum == k) { C++; } // DFS(chess, i, j+1); // 没有剪枝,300MS. DFS(chess, i+1, 0); //(第1次剪枝), 对行进行剪枝,由原来的300MS,变成200MS. sum--; colFlag[j] = true; } } } int main() { int i,j; while (cin>>n>>k && n!=-1 && k!=-1) { sum = 0; C = 0; for (i=0; i<=8-1; i++) { colFlag[i] = true; } for (i=0; i<=n-1; i++) { for (j=0; j<=n-1; j++) { cin>>chess[i][j]; } } DFS(chess, 0, 0); cout<<C<<endl; } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator