情オリ予選

たぶん116点。凡ミスで4点落とすのはもう嫌だお……。

というか2でミスったの俺だけだろ……。


5問目

#include<cstdio>

using namespace std;

int dp[100][100][2];

int main()
{
  for(int i=0; i<100; ++i) {
    dp[i][0][0] = 1;
    dp[0][i][1] = 1;
  }
  for(int i=1; i<100; ++i) {
    dp[i][1][0] = dp[i][1][1] = 1;
    dp[1][i][0] = dp[1][i][1] = 1;
  }
  for(int i=2; i<100; ++i) {
    for(int j=2; j<100; ++j) {
      dp[i][j][0] = dp[i-2][j][0] + dp[i-2][j-1][1] + dp[i-1][j-1][1];
      dp[i][j][1] = dp[i][j-2][1] + dp[i-1][j-2][0] + dp[i-1][j-1][0];
      dp[i][j][0] %= 100000;
      dp[i][j][1] %= 100000;
    }
  }
  int n, m;
  scanf("%d%d", &n, &m);
  printf("%d\n", (dp[n-1][m-1][0]+dp[n-1][m-1][1])%100000);
}

6問目

汚い

#include<cstdio>
#include<vector>
#include<cstring>

using namespace std;

int m, n, f[10][10], house, hid[10][10], sx, sy;
vector<int> hx[10], hy[10];
vector<int> xx, yy;
int memo[23][1<<23];

int dx[] = {1, -1, 0, 0};
int dy[] = {0, 0, 1, -1};

int dfs(int hn, int hu)
{
  if(memo[hn][hu] >= 0) return memo[hn][hu];
  int x = xx[hn], y = yy[hn];
  if(hu == 0) {
    if(x == sx) {
      int dy = y > sy ? -1 : 1;
      while(y < n && y >= 0) { 
	y += dy;
	if(f[y][x] == 2) return 1;
	if(f[y][x] == 3) return 0;
      }
    } else if(y == sy) {
      int dx = x > sx ? -1 : 1;
      while(x < m && x >= 0) {
	x += dx;
	if(f[y][x] == 2) return 1;
	if(f[y][x] == 3) return 0;
      }
    }
    return 0;
  }
  memo[hn][hu] = 0;
  for(int i=0; i<4; ++i) {
    int tx = x+dx[i], ty = y+dy[i];
    while(tx >= 0 && ty >= 0 && tx < m && ty < n) {
      if(f[ty][tx] == 3) break;
      if(f[ty][tx] == 1) {
	int hi = hid[ty][tx];
	f[ty][tx] = 3;
	memo[hn][hu] += dfs(hi, hu ^ (1 << hi));
	f[ty][tx] = 1;
      }
      tx += dx[i], ty += dy[i];
    }
  }
  return memo[hn][hu];
}

int main()
{
  scanf("%d%d", &m, &n);
  for(int i=0; i<n; ++i)
    for(int j=0; j<m; ++j)
      scanf("%d", &f[i][j]);
  for(int i=0; i<n; ++i)
    for(int j=0; j<m; ++j)
      if(f[i][j] == 1) {
	xx.push_back(j);
	yy.push_back(i);
	hid[i][j] = house++;
	hx[j].push_back(i);
	hy[i].push_back(j);
      }
      else if(f[i][j] == 2) sx = j, sy = i;
  int sol = 0, mm = (1<<house)-1;
  memset(memo, -1, sizeof(memo));
  for(int i=0; i<hy[sy].size(); ++i) {
    f[sy][hy[sy][i]] = 3;
    sol += dfs(hid[sy][hy[sy][i]], mm ^ (1 << hid[sy][hy[sy][i]]));
    f[sy][hy[sy][i]] = 1;
  }
  for(int i=0; i<hx[sx].size(); ++i) {
    f[hx[sx][i]][sx] = 3;
    sol += dfs(hid[hx[sx][i]][sx], mm ^ (1 << hid[hx[sx][i]][sx]));
    f[hx[sx][i]][sx] = 1;
  }
  printf("%d\n", sol);
}