Sudoku Killer
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int zeroNum;
int map[9][9];
int zero[81][2]; // 存储空位坐标,dfs直接搜索这些位置
void print()
{
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("%d", map[i][j]);
if(j==8) printf("
");
else printf(" ");
}
}
}
bool check(int cnt)
{
int row = zero[cnt][0];
int col = zero[cnt][1];
int subRowStart = row/3 * 3;
int subColStart = col/3 * 3;
for(int i = 0; i < 9; i++)
{
if(map[row][i]==map[row][col] && i!=col)
return false;
if(map[i][col]==map[row][col] && i!=row)
return false;
}
for(int i = subRowStart; i < subRowStart+3; i++)
{
for(int j = subColStart; j < subColStart+3; j++)
{
if(map[i][j]==map[row][col] && (i!=row || j!=col))
return false;
}
}
return true;
}
void dfs(int cnt) // cnt代表dfs深度
{
int row = zero[cnt][0];
int col = zero[cnt][1];
if(cnt > zeroNum) // 找到可行解,打印输出
{
print();
return ;
}
for(int k = 1; k <= 9; k++)
{
map[row][col] = k; // 枚举所有情况
if(check(cnt)) // Sodoku合法性检查
dfs(cnt+1); // 递归到下一层
// 注意map[row][col]在递归后还原值
map[row][col] = 0; // 保证上层每次枚举时深层都为空值状态
}
}
int main()
{
int num = 0;
char s[2];
while(scanf("%s", s)!=EOF)
{
zeroNum = 0;
memset(map, 0, sizeof(map));
memset(zero, 0, sizeof(zero));
if(s[0] == '?')
{
zero[++zeroNum][0] = 0;
zero[zeroNum][1] = 0;
map[0][0] = 0;
}
else
map[0][0] = s[0] - '0';
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
if(i || j)
{
scanf("%s", s);
if(s[0] == '?')
{
zero[++zeroNum][0] = i;
zero[zeroNum][1] = j;
map[i][j] = 0;
}
else
map[i][j] = s[0]-'0';
}
}
}
if(num++) printf("
"); // 测试用例间空行
dfs(1);
}
return 0;
}
Oil Deposits
#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
#define N 102
int cnt;
int m, n;
char map[N][N];
int flag[N][N];
int x[8] = {-1,0,1,1,1,0,-1,-1};
int y[8] = {-1,-1,-1,0,1,1,1,0};
int ii, jj;
struct Block
{
int row, col;
};
bool check(int i, int j)
{
if(i>=0 && i<m && j>=0 && j<n)
return true;
else return false;
}
void dfs(int i, int j)
{
flag[i][j] = 1;
for(int k = 0; k < 8; k++)
{
ii = i + x[k];
jj = j + y[k];
if(check(ii, jj) && map[ii][jj]=='@' && flag[ii][jj]==0)
dfs(ii, jj);
}
}
void bfs(int i, int j)
{
Block next, cur;
next.row = i;
next.col = j;
queue<Block> q;
q.push(next);
while(!q.empty())
{
cur = q.front();
q.pop();
flag[cur.row][cur.col] = 1;
for(int i = 0; i < 8; i++)
{
ii = cur.row + y[i];
jj = cur.col + x[i];
if(check(ii, jj))
{
if(map[ii][jj]=='@' && flag[ii][jj]==0)
{
next.row = ii;
next.col = jj;
q.push(next);
}
}
}
}
}
int main()
{
int i, j;
while(scanf("%d%d", &m, &n) && m && n)
{
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
cin >> map[i][j];
}
memset(flag, 0, sizeof(flag));
cnt = 0;
for(i = 0; i < m; i++)
{
for(j = 0; j < n; j++)
{
if(map[i][j]=='@' && flag[i][j]==0)
{
// dfs(i, j);
// bfs(i, j);
cnt++;
}
}
}
printf("%d
", cnt);
}
}