您的位置:首页 > 其它

UVA 639 - Don't Get Rooked

2013-03-10 23:00 330 查看
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <vector>
#include <math.h>
#include <queue>
#include <algorithm>
#include <time.h>
#define MAXX 10010
using namespace std;
char board[5][5];
int n, maxv = 0, countv = 0;
int can_place(int x, int y)
{
if((x >= n || x < 0) || (y >= n || y < 0 )){
return 0;
}
for(int i = x-1; i >= 0 && board[i][y] != 'X'; i--){
if(board[i][y] == '1')  return 0;
}
for(int i = y-1; i >= 0 && board[x][i] != 'X'; i--){
if(board[x][i] == '1')  return 0;
}
return 1;

}
void dfs(int cur)
{
int i = 0, j = 0;
//int canplace = 0;
for(i = cur; i < n; i++)
{
for(j = 0; j < n; j++)			//每一层所有的点都要遍历
{
if(board[i][j] == '.'){
//cout << "i, j " << i << " : " << j << endl;
if(can_place(i, j)) {
//cout << "i: " << i << " j: " << j << endl;
//canplace = 1;
board[i][j] = '1';
countv++;
dfs(i);
board[i][j] = '.';		//回溯
}
}
}
//if(canplace) break;
}
if(i == n && j == n){
/*
cout << "-------" << endl;
for(int a = 0; a < n; a++)
{
for(int b = 0; b < n; b++) cout << board[a][b];
cout << endl;
}
cout << "-------" << endl;
*/
if(countv > maxv) maxv = countv;
countv = 0;
return;
}

//dfs(i, j);
}
int main(int argc, char *argv[]) {
//freopen("test.in", "r", stdin);
while(cin >> n , n)
{
countv = 0, maxv = 0;
memset(board, 'X', sizeof(board));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) cin >> board[i][j];
dfs(0);
cout << maxv << endl;

}
return 0;
}


题目地址:点击打开链接

简单的回溯法,由于是菜鸟,写的代码效率不高。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: