题目地址:点击打开链接
直接用二进制法遍历一遍就可以了
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83#include <iostream> #include <string> #include <cstring> using namespace std; int n; string board[4]; int max_num; int visited[4][4]; bool isSafe() { for(int i=0;i<n;++i) { for(int j=0;j<n;++j) { if(board[i][j]=='.'&&visited[i][j]==1) { int a,b; a=i-1;b=j; while(a>=0&&board[a][b]!='X') { if(board[a][b]=='.'&&visited[a][b]==1) return false; --a; } a=i+1;b=j; while(a<n&&board[a][b]!='X') { if(board[a][b]=='.'&&visited[a][b]==1) return false; ++a; } a=i;b=j-1; while(b>=0&&board[a][b]!='X') { if(board[a][b]=='.'&&visited[a][b]==1) return false; --b; } a=i;b=j+1; while(b<n&&board[a][b]!='X') { if(board[a][b]=='.'&&visited[a][b]==1) return false; ++b; } } } } return true; } void judge(int val) { int num=0; memset(visited,0,sizeof(visited)); for(int i=0;i<n*n;++i) { if(val&(1<<i)) { int a=i/n; int b=i%n; if(board[a][b]=='X') return ; ++num; visited[a][b]=1; } } if(isSafe()&&num>max_num) max_num=num; } int main() { while(cin>>n&&n!=0) { for(int i=0;i<n;++i) cin>>board[i]; max_num=-1; for(int i=0;i<(1<<(n*n));++i) judge(i); cout<<max_num<<endl; } return 0; }
最后
以上就是潇洒路灯最近收集整理的关于UVa639 - Don't Get Rooked的全部内容,更多相关UVa639内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复