Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 2090 | Accepted: 1500 |
Description
Input
Output
Sample Input
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 1
Sample Output
15
Hint
Source
USACO 2005 November Bronze
题意:
在一个5X5 的格子里往四个方向跳,分别为上下左右,求共有几种不同字符串。
将字符串转换成整数,dfs + set 容器
代码如下:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<set> #define For(i, a, b) for(int i = a; i < b; i++) using namespace std; set <int> S; int Imap[6][6]; int dir[4][2] = {-1, 0, 1, 0, 0, -1, 0, 1}; int cleck(int x, int y) { return (x >= 0 && x < 5 && y >= 0 && y <5); } void dfs(int x, int y, int sum, int pos) { if(pos == 6) { S.insert(sum); return; } sum = 10 * sum + Imap[x][y]; For(i, 0, 4){ int tx = x + dir[i][0]; int ty = y + dir[i][1]; if(cleck(tx, ty)) dfs(tx, ty, sum, pos+1); } } int main() { //freopen("in.txt", "r", stdin); while(~scanf("%d", &Imap[0][0])){ For(i, 0, 5) For(j, 0, 5){ if(i == 0 && j == 0) continue; scanf("%d", &Imap[i][j]); } For(i, 0, 5) For(j, 0, 5) dfs(i, j, 0, 0); printf("%d\n", S.size()); } return 0; }